OpenNL线性系统求解库

OpenNL 是一个用于求解大型稀疏线性系统的C开发库。 它包括一个易于使用的用于组装矩阵的 API,以及用于对称和非对称系统的各种迭代求解器。 OpenNL API 在 geogram/NL/nl.h 中声明。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 

1、求解线性系统

让我们从一个简单的例子开始。 假设你要求解以下线性系统:

   [ 1 2 ] [x]   [5]
   [ 3 4 ] [y] = [6]

首先,你需要声明将存储系统解的变量。 然后,我们创建一个 OpenNL 上下文,并声明变量的数量:

  double x,y;
  nlNewContext();
  nlSolverParameteri(NL_NB_VARIABLES, 2);

现在我们可以构建线性系统了。 线性系统是逐行构建的。 OpenNL 有一个状态机,由 nlBegin()、 nlEnd() 调用控制。看起来与 OpenGL 2.x 类似,但OpenNL构建稀疏矩阵而不是图形基元:

  nlBegin(NL_SYSTEM);
  nlBegin(NL_MATRIX);
  nlBegin(NL_ROW);
  nlCoefficient(0, 1.0);
  nlCoefficient(1, 2.0);
  nlRightHandSide(5.0);
  nlEnd(NL_ROW);
  nlBegin(NL_ROW);
  nlCoefficient(0, 3.0);
  nlCoefficient(1, 4.0);
  nlRightHandSide(6.0);
  nlEnd(NL_ROW);
  nlEnd(NL_MATRIX);
  nlEnd(NL_SYSTEM);

接下来我们对系统进行求解:

  nlSolve();
  x = nlGetVariable(0);
  y = nlGetVariable(1);

最后,我们删除 OpenNL 上下文:

  nlDeleteContext(nlGetCurrent());

2、最小二乘回归

OpenNL 有一个特殊的最小二乘模式,可以组装正规方程(最小二乘)。 假设你有一个文件,其中每条线上都包含 X,Y 点坐标,并且想要找到最适合数据点的线方程 y=ax+b。 和之前一样,我们创建一个 OpenNL 上下文并声明变量的数量。 此外,我们激活最小二乘模式:

   nlNewContext();
   nlSolverParameteri(NL_LEAST_SQUARES, NL_TRUE);
   nlSolverParameteri(NL_NB_VARIABLES, 2);

然后,我们读取文件并根据文件数据组装矩阵:

  FILE* input = fopen("datapoints.dat", "r");
  double X,Y; // current datapoint
  nlBegin(NL_SYSTEM);
  nlBegin(NL_MATRIX);
  while(!feof(input)) {
     fread(input, "%f %f", &X, &Y);
     nlBegin(NL_ROW);
     nlCoefficient(0, X);
     nlCoefficient(1, 1.0);
     nlRightHandSide(Y);
     nlEnd(NL_ROW);
  }
  nlEnd(NL_MATRIX);
  nlEnd(NL_SYSTEM);

就像前面的例子一样,我们现在可以求解系统:

  nlSolve();
  a = nlGetVariable(0);
  b = nlGetVariable(1);

并且不要忘记关闭输入文件并删除 OpenNL 上下文:

  fclose(input);
  nlDeleteContext(nlGetCurrent());

3、具有锁定变量的最小二乘回归

如前面的示例所示,我们假设有一个文件,其中每条线上都包含 X,Y 点坐标,并且我们仍然希望找到最适合数据点的线方程 y=ax+b,但这一次我们有附加约束:直线的斜率 a 应等于 1。OpenNL 上下文的初始化与之前一样:

  FILE* input = fopen("datapoints.dat", "r");
  double X,Y; 
  nlNewContext();
  nlSolverParameteri(NL_LEAST_SQUARES, NL_TRUE);
  nlSolverParameteri(NL_NB_VARIABLES, 2);

当我们构建系统时,我们锁定变量 0(对应于 a)并设置其值(1.0),如下所示:

  nlBegin(NL_SYSTEM);
  nlLockVariable(0);
  nlSetVariable(0, 1.0);
  nlBegin(NL_MATRIX);
  while(!feof(input)) {
     fread(input, "%f %f", &X, &Y);
     nlBegin(NL_ROW);
     nlCoefficient(0, X);
     nlCoefficient(1, 1.0);
     nlRightHandSide(Y);
     nlEnd(NL_ROW);
  }
  nlEnd(NL_MATRIX);
  nlEnd(NL_SYSTEM);

然后剩下的就和以前一样了:

  nlSolve();
  a = nlGetVariable(0);
  b = nlGetVariable(1);
  fclose(input);
  nlDeleteContext(nlGetCurrent());

原文链接:用OpenNL求解线性系统 - BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/301150.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux反汇编工具: ida pro、rizinorg/cutter; ubuntu 22 flameshot延迟截图 以应对下拉菜单

rizinorg/cutter rizinorg/cutter 是 命令行反汇编工具 rizinorg/rizin 的图形化界面, 这比 ida pro跑在kvm虚拟机中方便多了, ubuntu22.04下直接下载Cutter-v2.3.2-Linux-x86_64.AppImage后即可运行,如下图: 注意 有个同名的报废品: radare2/Cutter 即 radare2的图形化界…

TypeScript 从入门到进阶之基础篇(八)函数篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇TypeScript 从入门到进阶…

docker 安装elasticsearch、kibana、cerebro、logstash

安装步骤 第一步安装 docker 第二步 拉取elasticsearch、kibana、cerebro、logstash 镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.2 docker pull docker.elastic.co/kibana/kibana:7.10.2 docker pull lmenezes/cerebro:latest docker pull l…

ClickHouse基础知识(七):ClickHouse的分片集群

副本虽然能够提高数据的可用性,降低丢失风险,但是每台服务器实际上必须容纳全量数据,对数据的横向扩容没有解决。 要解决数据水平切分的问题,需要引入分片的概念。通过分片把一份完整的数据进行切 分,不同的分片分布到…

Vue知识总结-中

VUE-生命周期 生命周期概述 生命周期也常常被称为生命周期回调函数/生命周期函数/生命周期钩子生命周期是Vue在关键时刻帮我们调用的一些特殊名称的函数生命周期函数的名字不能更改,但函数的具体内容是由我们程序员自己编写的生命周期函数中的this指向是vm或组件实例对象 生命周…

【Flutter 开发实战】Dart 基础篇:从了解背景开始

想要学会用 Flutter 开发 App,就不可避免的要学习另一门很有意思的编程语言 —— Dart。很多小伙伴可能在学习 Flutter 之前可能都没听说过这门编程语言,我也是一样,还以为 Dart 是为了 Flutter 而诞生的;然而,当我们去…

【嵌入式】Makefile 学习笔记记录 | 嵌入式Linux

文章目录 前言一、Makefile的引入——最简单的gcc编译过程二、Makefile的规则三、Makefile的语法3.1、通配符3.2、假想目标 .phony3.3、即时变量 延时变量 四、Makefile的函数4.1、foreach4.2、filter4.3、wildcard4.4、patsubst 五、Makefile升级5.1、包含头文件在内的依赖关系…

Force Yc 第六引导公告网页源码

Force Yc 第六引导公告网页源码,HTML源码,本地双击index.html即可运行,内容体积小,美观大气,二次元风格,喜欢的朋友可以拿去研究 蓝奏云:https://wfr.lanzout.com/iZsjv1kexkod

西电期末1035.可构造三角形个数

一.题目 二.分析与思路 依旧是遍历判断&#xff0c;三角形任意两边之和大于第三边&#xff0c;读题&#xff01;&#xff01;&#xff01;&#xff1a;连续的三个数&#xff01;&#xff01;&#xff01; 三.代码实现 #include<bits/stdc.h>//万能头 int main() {int …

机器视觉篇

1&#xff1a;实现LCD显示文字 实验名称&#xff1a;LCD 版本&#xff1a; v1.0 日期&#xff1a; 2022.12 作者&#xff1a; 01Studio 说明&#xff1a;编程实现LCD显示信息。需要将01Studio.bmp文件发送到开发板 import lcd,image,utimelcd.init() #初始化LCD lcd.clear(lcd…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第五天-Linux消息共享内存练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

案例介绍|钡铼助力2023年全国职业院校技能大赛工业网络智能控制与维护赛项

如今&#xff0c;越来越多的企业开始意识到数字制造和工业物联网已经成为工业自动化中大规模生产的核心驱动力。这其中&#xff0c;工业网络作为基础设施&#xff0c;是实现工厂设备联网与数据采集&#xff0c;建设数字工厂的基础和前提&#xff0c;甚至成为关乎数字工厂能否真…

【动态规划】C++算法312 戳气球

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 动态规划 LeetCode312 戳气球 有 n 个气球&#xff0c;编号为0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&…

PIG框架学习2——资源服务器的配置详解

一、前言 1、pig资源服务器的配置 Spring Security oauth2相关的依赖是在pigx-common-security模块中引入的&#xff0c;其他模块需要进行token鉴权的&#xff0c;需要在微服务中引入pigx-common-security模块的依赖&#xff0c;从而间接引入相关的Spring security oauth2依赖…

环境中碳循环

含碳的物质有CO2、CO、CH4、糖类、脂肪和蛋白质等&#xff0c;碳循环以CO2为中心&#xff0c;CO2被植物、藻类利用进行光合作用&#xff0c;合成植物性碳&#xff1b;动物摄食植物就将植物性碳转化为动物性碳&#xff1b;动物和人呼吸放出CO2&#xff0c;有机碳化合物被厌氧微生…

nodejs安装、nodejs环境变量配置、npm安装、vue安装

官网下载链接:https://nodejs.org/en/download/ 个人下载版本&#xff1a;node-v20.10.0-x64.msi&#xff0c;下载完成后&#xff0c;点击安装&#xff0c;除了更换安装目录&#xff0c;其他直接下一步即可 安装完成后执行&#xff1a;npm -v 下面开始配置环境变量&#xf…

Spring应用的部署与管理

一、前言 部署是将开发好的应用发布到服务器上&#xff0c;使其能够被用户访问的关键步骤。Spring框架提供了灵活的部署选项&#xff0c;本文将介绍Spring应用的常见部署方式和一些建议&#xff0c;帮助开发者顺利将应用投放到生产环境。 二、传统部署方式&#xff1a;WAR包 传…

Github 2024-01-08开源项目周报 Top14

根据Github Trendings的统计&#xff0c;本周(2024-01-08统计)共有14个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目5TypeScript项目3C项目2Dart项目1QML项目1Go项目1Shell项目1Rust项目1JavaScript项目1C#项目1 免费…

【一】使用vue-cli创建vue3的helloworld项目

不再推荐使用vue-cli命令创建vue3的项目&#xff0c;vue-cli 是 Vue 早期推出的一款脚手架&#xff0c;使用 webpack 创建 Vue 项目。后期推荐使用 create-vue&#xff0c;create-vue 是 Vue3 的专用脚手架&#xff0c;使用 vite 创建 Vue3 的项目(关注【二】使用create-vue创建…

XML技术分析05

一、DOM 使用DOM扫描器程序&#xff1a;DOM扫描器是一种非常通用的程序&#xff0c;它不需知道用户定制的XML标记的确切含义。DOMAPI具有某些能把任何数据存储到树形结构中的接口。扫描器具有一组实现了这些接口的类&#xff0c;可以实例化这些类的对象。 这些接口和类…