OpenNL线性系统求解库

2024-01-08 14:36
文章标签 求解 线性系统 opennl

本文主要是介绍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 datapointnlBegin(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

这篇关于OpenNL线性系统求解库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/583787

相关文章

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

基于SA模拟退火算法的多车辆TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述        基于SA模拟退火算法的多车辆TSP问题求解matlab仿真,三个车辆分别搜索其对应的最短路径,仿真后得到路线规划图和SA收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 (完整程序运行后无水印)

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

JD 1147:Jugs(一种用最少步骤求解的方法)

OJ题目:click here~~ 题目分析:九度上这道没有要求最少步数,只要得到最后结果即可AC , bfs , dfs都行。最少步骤的方法肯定也能AC啦,分析如下。 输入的三个数:a,b,n;> 由题不定方程ax+by=n必定有解> 如果b=n,则fill B即可,否则用试探法求出这样的两组解(a1,b1)及(a2,b2),其中a1 >0,b1<0;a1是满足方程的最小正整数;a2

【2024全国大学生数学建模竞赛】B题 模型建立与求解(含代码与论文)

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明(等四问全部更新完再写)5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成! - 晚上7-8点之前第二问完成 - 明天中文之前全部写完 按照提交论文的格式进行撰写!完整版请看文章最后!

Java 快速求解x的x次幂结果为10

1.问题描述 如果x的x次幂结果为10(如图所示),你能计算出x的近似值吗? 显然,这个值是介于2和3之间的一个数字。 可以使用牛顿迭代公式进行求解,因为是逼近算法可以大大减少运算次数 public static void main(String[] args) {int i = 0;double x1 = 2.5;while (true) {i++;//x^x - 10 = 0//这一步

最值求解 | 管理类联考数学专项

日期内容2024.9.5新建2024.9.6曦曦求最值完结 实数求最值至少至多抽屉原理工程问题线性规划一次性绝对值求最值 参考: b站跟着曦曦老师玩转【最值】

2024数学建模国赛A题详细思路:基于空间几何运动学和优化模型matlab求解

2024数学建模国赛A题“板凳龙”闹元宵 2024高教社杯数学建模竞赛A题B题C题D题E题完整成品文章和全部问题的解题代码完整版本更新如下:https://www.yuque.com/u42168770/qv6z0d/rytbc1nelty1mu4o % 定义常量L_head = 3.41; % 龙头长度(米)L_body = 2.20; % 龙身长度(米)spiral_pitch =

清华MEM作业-利用管理运筹学的分析工具slover求解最优解的实现 及 通过使用文件或者套节字来识别进程的fuser命令

一、清华MEM作业-利用管理运筹学的分析工具slover求解最优解的实现         最近又接触了一些线性求解的问题,以前主要都是在高中数学里接触到,都是使用笔算,最后通过一些函数式得出最小或者最大值,最近的研究生学业上接触到了一个Excel solver分析工具,对这种线性求最优解的问题感觉使用起来真是得心应手。在使用这个工具前,EXCEL里需要先装上solver工具,装起来很也简单,网上