Unity中使用C#以【拟牛顿法】来求解非线性方程组

python科学计算包中有一个fsolve函数来求解非线性方程组,那么C#中用什么包和什么api与之对应呢?本文仅针对拟牛顿法求解过程展开MathNet包中对应API的考察和测试。

一、案例1

1、方程组

在这里插入图片描述

2、python的解法

  • (1)代码
from scipy.optimize import fsolve
from math import exp ,sin
def f(x,*arg): f1=exp(x)+sin(x) f2=0.2return(f1-f2)
result=fsolve(f,x0=0)
print(result)
  • (2)计算结果:
-0.45173218
  • (3) jupyter运行:
    在这里插入图片描述

3、C#的解法

  • (1)使用的包MathNet
using MathNet.Numerics;
using MathNet.Numerics.RootFinding;
  • (2)用——拟牛顿法——Broyden.FindRoot()实现
[ContextMenu("拟牛顿法求根 2 ")]
void testN2()
{// 定义方程组Func<double[], double[]> equations = x => new[] {Math.Exp(x[0]) + Math.Sin(x[0]) - 0.2};try{// 初始猜测double[] initialGuess = { 0.0 };// 使用 Broyden 方法求解方程组double[] solution = Broyden.FindRoot(equations, initialGuess);// 输出解Debug.Log($"方程组的解为: {solution[0]}");}catch (NonConvergenceException ex){Debug.Log($"求解失败: {ex.Message}");}
}
  • (3)计算结果
    方程组的解为: -0.451732182380972

  • (4)Win10 + Unity2021.3.18 环境测试
    在这里插入图片描述

4、结论:

结果一致

二、案例2

在这里插入图片描述

1、Python解法

import numpy as np
from scipy.optimize import fsolvedef equation(b):left = np.power(b + 0.35 * b, 2) + np.power(b - 0.35 * b, 2) - np.power(50, 2)right = np.cos(np.radians(30)) * 2 * (b + 0.35 * b) * (b - 0.35 * b)return left - right# 初始猜测值
initial_guess = 0.1# 求解方程
solution = fsolve(equation, initial_guess)print(f"Solution: b = {solution[0]}")

计算结果:

Solution: b = 58.71694350541571

在这里插入图片描述

2、C#解法

[ContextMenu("拟牛顿法求根 1 ")]
void testN()
{Func<double[], double[]> equation = b => new[] {Math.Pow(b[0] + 0.35 * b[0], 2) + Math.Pow(b[0] - 0.35 * b[0], 2) - Math.Pow(50, 2) -Math.Cos(30.0 * Math.PI / 180) * 2 * (b[0] + 0.35 * b[0]) * (b[0] - 0.35 * b[0])};double[] initialGuess = { 1 };double[] solution = Broyden.FindRoot(equation, initialGuess,maxIterations:20000);Debug.Log($"方程的解b为: {solution[0]}");
}

结算结果

方程的解b为: 58.7169435054131

在这里插入图片描述

3、结论

结果一致

三、案例3

1、方程组

未知数:ϕ0 ,ψ0 ,P0 ,P1 ,P2
方程组:
在这里插入图片描述

2、 C#的计算过程

// 已知参数double phi1 = 1.46683d.ToRadians(), phi2 = 12.36644d.ToRadians(), phi3 = 30d.ToRadians(), phi4 = 47.63356d.ToRadians(), phi5 = 58.5317d.ToRadians();double psi1 = 3.13922d.ToRadians(), psi2 = 24.33225d.ToRadians(), psi3 = 52.64663d.ToRadians(), psi4 = 75.87842d.ToRadians(), psi5 = 88.40146d.ToRadians();           // 定义方程组函数Func<double[], double[]> equations = x =>{double P0 = x[0];double P1 = x[1];double P2 = x[2];double phi0 = x[3];double psi0 = x[4];double equation1 = Math.Cos(phi1 + phi0) - (P0 * Math.Cos(psi1 + psi0) + P1 * Math.Cos((psi1 + psi0) - (phi1 + phi0)) + P2);double equation2 = Math.Cos(phi2 + phi0) - (P0 * Math.Cos(psi2 + psi0) + P1 * Math.Cos((psi2 + psi0) - (phi2 + phi0)) + P2);double equation3 = Math.Cos(phi3 + phi0) - (P0 * Math.Cos(psi3 + psi0) + P1 * Math.Cos((psi3 + psi0) - (phi3 + phi0)) + P2);double equation4 = Math.Cos(phi4 + phi0) - (P0 * Math.Cos(psi4 + psi0) + P1 * Math.Cos((psi4 + psi0) - (phi4 + phi0)) + P2);double equation5 = Math.Cos(phi5 + phi0) - (P0 * Math.Cos(psi5 + psi0) + P1 * Math.Cos((psi5 + psi0) - (phi5 + phi0)) + P2);return new[] { equation1, equation2, equation3, equation4, equation5 };};// 初始猜测值double[] initialGuess = {20d, 20d, 20d,20d, 20d};// 调用Broyden.FindRoot方法求解double[] solution = Broyden.FindRoot(equations, initialGuess,accuracy:1e-7,maxIterations:10000);// 输出解Debug.Log($"P0 = {solution[0]}, P1 = {solution[1]}, P2 = {solution[2]}, phi0 = {solution[3]}, psi0 = {solution[4]}");

计算结果:
在这里插入图片描述

3、结论

与第三方软件的【拟牛顿法】计算结果一致!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xlsx.js读取本地文件,按行转成数组数据

1.下包 //1. npm install xlsx //2. yarn add xlsx2.结构 <template><input type"file" change"onFileChange" /> </template>3.代码 <script> import * as XLSX from xlsxexport default {methods: {onFileChange (event) {/…

selenium高级应用

常见控件应用 复杂的控件操作1.操作Ajax选项2.滑动滑块操作 WebDriver的特殊操作元素class值包含空格property、attribute、text的区别定位动态id 截图功能页面截图页面截图&#xff0c;返回截图的二进制数据页面截图&#xff0c;返回base64的字符串截取指定元素。先定位元素&a…

计算机网络—以太网接口和链路配置

目录 1.拓扑图 2.以太网交换机基础配置 3.配置手动模式的链路聚合 4.配置静态 LACP 模式的链路聚合 5.配置文件 1.拓扑图 2.以太网交换机基础配置 华为交换机接口默认开启了自协商功能&#xff0c;需要手动配置S1与 S2上G0/0/9和G0/0/10接口的速率。 首先修改交换机的设…

深入理解Vue.js中的nextTick:实现异步更新的奥秘

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

代码随想录算法训练营第五十三天|1143.最长公共子序列 、1035.不相交的线、53. 最大子序和

文章目录 1.最长公共子序列2.不相交的线3.最大子序和 1.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列&#xff0c;返回 0。 一个字符串的子序列是指这样一个新的字符串&#xff1a;它是由原字符串…

两会声音|中国石化人大代表:要突出战略性新兴产业、未来产业的位置

十四届全国人大二次会议即将闭幕&#xff0c;“新质生产力”首次写入政府工作报告&#xff0c;并出现在了重要位置。政府工作报告主要从推动产业链供应链优化升级、积极培育新兴产业和未来产业、深入推进数字经济创新发展等三个方面进行了阐述和规划。 全国两会期间&#xff0c…

C语言 --- 指针(5)

目录 一.sizeof和strlen对比 1.sizeof 2.strlen 3.strlen 和sizeof的对比 二.数组和指针笔试题目详解 回顾&#xff1a;数组名的理解 1.一维数组 2.字符数组 代码1&#xff1a; 代码2&#xff1a; 代码3&#xff1a; 代码4&#xff1a; 代码5&#xff1a; 代码6&am…

计算机网络—eNSP搭建基础 IP网络

目录 1.下载eNSP 2.启动eNSP 3.建立拓扑 4.建立一条物理连接 5.进入终端系统配置界面 6.配置终端系统 7.启动终端系统设备 8.捕获接口报文 9.生成接口流量 10.观察捕获的报文 1.下载eNSP 网上有许多下载eNSP的方式&#xff0c;记得还要下其它三个Virtual Box、Winpa…

Net8 ABP VNext集成FreeSql、SqlSugar

ABP可以快速搭建开发架构&#xff0c;但是内置的是EFCore&#xff0c;国内中小企业使用FreeSql与SqlSugar还是较多&#xff0c;为新手提供使用提供参考 ABP、FreeSql、SqlSugar参考地址&#xff1a; ABP Framework | Open source web application framework for ASP.NET Core…

mysql下载教程

什么是mysql MySQL是一种开源的关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;现在由Oracle公司维护。MySQL支持多个操作系统&#xff0c;包括Linux、Windows、macOS等。它是一种客户端/服务器模式的数据库&#xff0c;提供高效、可靠、稳定的数据存储和…

如何判断DNS解析故障?

DNS解析负责将域名解析到对应的IP地址&#xff0c;从而实现用户通过域名访问站点的效果。因此DNS解析是整个互联网中非常关键和基础的一个环节&#xff0c;但也是众多网站运营者和管理者经常忽视的一个环节。所以在出现DNS解析错误时&#xff0c;很多人都会感到手足无措&#x…

最新基于R语言lavaan结构方程模型(SEM)技术

原文链接&#xff1a;最新基于R语言lavaan结构方程模型&#xff08;SEM&#xff09;技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596681&idx4&sn08753dd4d3e7bc492d750c0f06bba1b2&chksmfa823b6ecdf5b278ca0b94213391b5a222d1776743609cd3d14…