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.2
    return(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 fsolve

def 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、结论

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

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

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

相关文章

大语言模型智能体简介

大语言模型&#xff08;LLM&#xff09;智能体&#xff0c;是一种利用大语言模型进行复杂任务执行的应用。这种智能体通过结合大语言模型与关键模块&#xff0c;如规划和记忆&#xff0c;来执行任务。构建这类智能体时&#xff0c;LLM充当着控制中心或“大脑”的角色&#xff0…

【webrtc】m122:BitrateProber 源码阅读与分析

pacing controller 需要 bitrate prober Pacing模块中存在一个BitrateProber prober_的成员变量,专门用来处理带宽探测 大神的分析也是基于最新版本webrtc的:ProbeController每次可能会生成多个探测源数据ProbeClusterConfig,其中每个源数据ProbeClusterConfig对应一个探测簇…

现代DevOps如何改变软件开发格局

在软件开发的早期&#xff0c;该过程通常是开发人员编写代码&#xff0c;再将其交给质量保证&#xff08;QA&#xff09;进行测试。这种瀑布开发方法可能会导致质量问题和延迟&#xff0c;因为问题是在周期后期发现的。 一、了解DevOps和测试左移 DevOps是Development和Opera…

深度学习_VGG_3

目标 知道VGG网络结构的特点能够利用VGG完成图像分类 2014年&#xff0c;牛津大学计算机视觉组&#xff08;Visual Geometry Group&#xff09;和Google DeepMind公司的研究员一起研发出了新的深度卷积神经网络&#xff1a;VGGNet&#xff0c;并取得了ILSVRC2014比赛分类项目…

某聘 zp__stoken__

前言: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018…

Shell正则表达式

目录 正则表达式的分类 基本组成部分 POSIX字符类 元字符 正则表达式的分类 基本的正则表达式&#xff08;Basic Regular Expression 又叫Basic RegEx 简称BREs&#xff09;扩展的正则表达式&#xff08;Extended Regular Expression 又叫Extended RegEx 简称EREs&#xf…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PatternLock)

图案密码锁组件&#xff0c;以九宫格图案的方式输入密码&#xff0c;用于密码验证场景。手指在PatternLock组件区域按下时开始进入输入状态&#xff0c;手指离开屏幕时结束输入状态完成密码输入。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#…

日期组件报错:Prop being mutated: “placement“

在使用vue2.0开发项目时遇到一个使用日期选择器的报错 报错截图&#xff1a; 对比官网比对没有发现问题&#xff0c;后来查询资料找到了两个解决方案 方案1&#xff08;推荐&#xff09;&#xff1a; 在日期组件的标签处添加如下属性placement“bottom-start”&#xff1a;…

openssl3.2 - 官方demo学习 - encode - ec_encode.c

文章目录 openssl3.2 - 官方demo学习 - encode - ec_encode.c概述笔记产生ecc私钥产生ecc公钥测试工程备注备注END openssl3.2 - 官方demo学习 - encode - ec_encode.c 概述 官方demos/encode 目录中给了2个例子工程 功能是载入(RSA/ECC)公钥, 然后自己就可以拿内存中的公钥对…

如何保护企业云上安全

近日&#xff0c;CrowdStrike发布了《2024年全球威胁报告》&#xff0c;揭示了网络攻击的最新趋势。报告指出&#xff0c;网络攻击生态系统仍在持续增长&#xff0c;CrowdStrike在2023年观察到了34个新的威胁参与者。同时&#xff0c;攻击者正越来越多地瞄准云环境&#xff0c;…

机器学习,剪刀,石头,布

计算机视觉:剪刀,石头,步 TensorFlow AI人工智能及Machine Learning训练图集的下载建立分类模型并用图像进行训练检验模型总结当前AI Machine Learning 异常火爆,希望在MCU上使用机器学习,做图像识别的工作。看到一个剪刀,石头,步的学习程序,给大家分享一下。 TensorFl…

Centos7 安装mongodb 7.0

官方手册参考&#xff1a; https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-red-hat/ Mongodb支持的版本 安装 MongoDB 社区版 按照以下步骤使用包管理器安装 MongoDB Community Edition yum。 配置包管理系统 ( yum) 创建一个/etc/yum.repos.d/mongodb-o…

【机器学习】科学库使用第1篇:机器学习(常用科学计算库的使用)基础定位、目标【附代码文档】

机器学习&#xff08;科学计算库&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习&#xff08;常用科学计算库的使用&#xff09;基础定位、目标&#xff0c;机器学习概述&#xff0c;1.1 人工智能概述&#xff0c;1.2 人工智能发展历…

使用OpenCV实现两张图像融合在一起

简单介绍 图像融合技术是一种结合多个不同来源或不同传感器捕获的同一场景的图像数据&#xff0c;以生成一幅更全面、更高质量的单一图像的过程。这种技术广泛应用于遥感、医学影像分析、计算机视觉等多个领域。常见的图像融合技术包括基于像素级、特征级和决策级的融合方法&a…

每日OJ题_路径dp⑥_力扣174. 地下城游戏

目录 力扣174. 地下城游戏 解析代码 力扣174. 地下城游戏 174. 地下城游戏 难度 困难 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对…

HTML 学习笔记 总结

总结 【标签按照功能进行分类】&#xff1a; <!DOCTYPE html>&#xff1a;声明为 HTML5 文档 <html>&#xff08;双标记、块标记&#xff09;&#xff1a;是 HTML 页面的根元素&#xff0c;定义 HTML 文档 <head>&#xff08;双标记、块标记&#xff09;&a…

缓存更新策略(旁路更新策略)

文章目录 前言旁路更新策略读操作写操作 总结 前言 Redis &#xff0c;是基于内存的数据库&#xff0c;我们常将其做为缓存&#xff0c;在数据访问时&#xff0c;达到更高的性能。 那么该如何使用 Redis 做为缓存呢&#xff1f;本篇文章介绍缓存的更新策略——Cache-Aside&am…

ASP.Net实现玩具管理(三层架构,两项数据相乘)

目录 演示功能&#xff1a; 点击启动生成页面 步骤&#xff1a; 1、建文件 ​编辑 2、添加引用关系 3、根据数据库中的列写Models下的XueshengModels类 4、DAL下的DBHelper&#xff08;对数据库进行操作&#xff09; 5、DAL数据访问层下的service文件 6、BLL业务逻辑层…

Vue3全家桶 - Vue3 - 【6】组件(注册组件 + 组件通信 + 透传属性和事件 + 插槽 + 单文件CSS + 依赖注入)

组件 一、 注册组件 1.1 ❌ 全局注册 目标文件&#xff1a;main.js&#xff1b;语法&#xff1a;import { createApp } from vue import App from ./App.vue const app createApp(App)// 全局注册 app.component(组件名字, 需要注册组件)app.mount(#app)缺陷&#xff1a; 全…

06-集合篇 面试题

1.算法复杂度分析 为什么要进行复杂度分析? 指导你编写出性能更优的代码评判别人写的代码的好坏分类: 时间复杂度分析空间复杂度分析/*** 求1~n的累加和 * @param n * @return*/ public int sum(int n) {int sum = 0;for (int i = 1; i <= n; i++) {sum = sum + i;}retur…