当前位置: 首页 > news >正文

记录一段帮朋友写的代码,使用牛顿-拉夫逊方法解方程

要求

已知公式:
t = G + A B F r + B r 2 2 F + A 2 B + G A F ln ⁡ ( r − A ) + C o n s t t=\frac{G+AB}{F}r+\frac{Br^2}{2F}+\frac{A^2B+GA}{F}\ln (r-A)+Const t=FG+ABr+2FBr2+FA2B+GAln(rA)+Const
其中

  • t 的值为0-1000,每间隔25取一次值
  • A=2.12941E-10
  • B=0.637224706
  • F=1.2652E-08
  • G=4.28646E-06
  • Const=1.90196E-06

求r的值。

解法

要解这样的方程通常需要用到数值方法。对于这样的复杂方程,我们可以使用牛顿-拉夫逊法来求解。
牛顿-拉夫逊方法的基本思想是:从一个初始猜测值开始,使用函数的导数(或切线的斜率)来更新猜测值,逐步逼近函数的真实零点。
首先,我们需要定义方程和它的导数,然后根据初始值逐渐逼近正确的解。

/*使用牛顿-拉夫逊法来求解。
牛顿-拉夫逊方法的基本思想是:从一个初始猜测值开始,使用函数的导数(或切线的斜率)来更新猜测值,逐步逼近函数的真实零点。
首先,定义方程function和它的导数定义了方程和其导数derivative,然后根据初始值逐渐逼近正确的解。
newtonRaphson函数使用牛顿-拉夫逊方法迭代地逼近方程的根,从一个初始猜测值开始。
*/
#include <stdio.h>
#include <math.h>
// 设置阈值,用于决定函数的值何时足够接近于0
// 当函数的值的绝对值小于这个阈值时,可以认为我们找到了方程的一个解
#define TOLERANCE 1e-6
// 设置去迭代的最大次数,防止无限迭代
#define MAX_ITER 1000double A = 2.12941E-10;
double B = 0.637224706;
double F = 1.2652E-08;
double G = 4.28646E-06;
double Const = 1.90196E-06;// 定义函数
double function(double r, double t) {return (G + A * B) * r / F + B * r * r / (2 * F) + (A * A * B + G * A) * log(r - A) / F + Const - t;
}// 定义函数对r的导数
double derivative(double r) {return (G + A * B) / F + B * r / F + (A * A * B + G * A) / (F * (r - A));
}// 使用牛顿-拉夫逊法求解
double newtonRaphson(double t) {double r = 1.0; // 初始的猜测值for (int i = 0; i < MAX_ITER; i++) {double f = function(r, t);  // 函数在当前猜测值处的值double f_prime = derivative(r); // 函数在当前猜测值处的导数值(也就是切线的斜率)// f的绝对值小于阈值,返回r值if (fabs(f) < TOLERANCE)return r;r = r - f / f_prime;    // 牛顿-拉夫逊方法中的关键更新步骤,用于寻找函数的零点或根}// 超过迭代的最大次数,返回r值return r;
}int main() {int i=1;for (double t = 25; t <= 1000; t += 25) {printf("第%d次迭代:",i++);double r = newtonRaphson(t);printf("t = %lf, r = %lf\n", t, r);}return 0;
}

运行结果:
在这里插入图片描述

这里,我随机选择了r = 1.0作为开始迭代的初始值。选择合适的初始猜测值很重要,因为不同的初始值可能会导致不同的收敛结果,或者在某些情况下可能不会收敛。如果r = 1.0不适用于这个方程或特定的t值范围,可能需要根据实际情况调整这个值。

通常,基于对问题的了解和对方程的形状有一定的认识,选择一个合理的初始值是有帮助的。如果不确定最佳的初始猜测值是多少,可以尝试多个值并检查结果的稳定性。

另外,阈值TOLERANCE和最大迭代次数MAX_ITER的值也需要自行根据经验选择。

http://www.lryc.cn/news/212182.html

相关文章:

  • 滑动窗口限流算法实现一
  • 简单明了!网关Gateway路由配置filters实现路径重写及对应正则表达式的解析
  • EMQX内置Web管理控制台-Dashboard
  • 计算机网络重点概念整理-第四章 网络层【期末复习|考研复习】
  • 数组转树形数据
  • react动态插入样式
  • OkHttp网络框架深入理解-SSL握手与加密
  • Mac 安装使用NPM及常用命令
  • 利用 JSqlParser 防止 SQL 注入
  • 10.27~10.29数电第三次实验分析与问题
  • 【软考】14.3 设计模式
  • Mac docker+vscode
  • LLVM学习笔记(58)
  • C语言 每日一题 PTA 10.30 day8
  • nacos在linux中的安装、集群的配置、mysql生产配置
  • OpenAI 组建安全 AGI 新团队!应对AI“潘多拉魔盒”
  • 上网行为管理软件有哪些丨功能图文超详细介绍
  • DVWA-SQL Injection SQL注入
  • 【0基础学Java第四课】-- 逻辑控制
  • C++中的std::cout与std::cerr、std::clog
  • No authorization token was found
  • Kubernetes概述及其组件/核心组件
  • 毫米波雷达实时采集教
  • Java进阶(HashMap)——面试时HashMap常见问题解读 结合源码分析
  • Kotlin 使用@BindingAdapter编译出错
  • Qt之信号和槽,connect参数分析
  • Python学习笔记—元组
  • 【C++项目】高并发内存池第五讲内存回收释放过程介绍
  • [毕设记录]@学术工具体验:Sread.ai
  • uboot - 驱动开发 - 驱动模型