文中部分内容参考网上博客以及GPT协助,希望能对你有所帮助~
Gitee限制100M文件上传,exe文件可自行打包或者前往前往CSDN博客文末下载: https://blog.csdn.net/m0_66570338/article/details/139641690
牛顿迭代法(Newton's Method),也称为牛顿-拉弗森方法(Newton-Raphson Method),是一种用于寻找函数零点或者说方程的根的迭代数值方法。它是一种非常有效的数值分析技术,具有收敛速度快的特点,通常用于求解实数域上的非线性方程,特别是在科学和工程领域中经常遇到的问题。
牛顿迭代法的基本思想是通过不断地逼近函数零点来求解方程。其迭代过程如下:
初始值选择:选择一个初始猜测值 ( x0 ) 作为函数的根的近似值。
迭代公式:根据函数的导数和当前的猜测值,使用牛顿迭代公式进行迭代计算:\[x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} \]
迭代更新:重复步骤2,实际中$x_{n+1}=x_n$可能永远达不到,可根据给定的条件进行判断,迭代到满足停止迭代的条件,如达到指定的精度要求$|x_{n+1}-x_n|<△$或达到最大迭代次数,此时的$x_{n+1}$即为所求。
迭代公式简单推导:
假设 f(x) 是关于x的函数,求出 f(x) 的一阶导,即斜率:
\[f'(x_n) = \frac{△y}{△x} = \frac{f(x_n) - 0}{x_n - x_{n+1}} = \frac{0 - f(x_n)}{(x_{n+1}-x_n)} \]
简化等式即可得到迭代公式:
\[x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} \]
然后便可以利用得到的最终式进行迭代运算直到求到一个比较精确的值
Newton迭代法的几何解释:
方程 f(x) = 0 的根 $x^*$ 为 y = f(x) 和 y = 0 (即x轴)的交点,设 $x_k$ 为 $x^*$ 的某个初始近似值,过 $P_k$ 点 ( $x_k$ , $f(x_k)$ ) 作 y = f(x) 的切线交 x 轴于 $x_{k+1}$,即为所求得的近似值。继续过 $P_{k+1}$ 点 ( $x_{k+1}$ ,$f(x_{k+1})$ ) , $P_{k+2}$ 点 ($x_{k+2}$ ,$f(x_{k+2})$ ),···,作 y = f(x) 的切线,即可逐步逼近精确的根 $x^*$ 。因此,Newton法也叫切线法,因为它是沿着曲线 y = f (x) 上某一点作切线逐步外推逼近的。从 $P_K$ 点作切线与x轴的交点 $x_{k+1}$,由于 y = f(x) 不是直线,所以 $f (x_{k+1})$ 就不可能为零。因此必须以 $x_{k+1}$ 作为新的起点,从与之对应的 $P_{k+1}$ 点继续作切线,重复上述步骤,直至 $f(x_{k+1})$ 充分小,逼近零时为止。
牛顿迭代法具有如下特点:
收敛性:在满足一定条件下,牛顿迭代法通常具有二阶收敛性,即每次迭代后,误差的平方将减小为原来的四分之一。
初值敏感性:牛顿迭代法对初始猜测值 ( x0 ) 的选择十分敏感,不同的初始值可能会导致不同的迭代结果,甚至可能出现发散的情况。
局部收敛:牛顿迭代法只能保证在初始猜测值附近的某个范围内收敛到函数的一个根,如果初始猜测值距离根较远,可能导致迭代过程不收敛或收敛到错误的根。
牛顿迭代法核心算法实现逻辑:
from sympy import *
# 定义变量
x = Symbol('x')
# 解析输入的函数函数
self.f_expr = eval(self.function_entry.get())
# 使函数可调用
self.f = lambdify(x, self.f_expr)
# 求函数的一阶导数
self.df_expr = diff(self.f_expr, x)
# 使函数可调用
self.df = lambdify(x, self.df_expr)
# 牛顿法(输入三个参数,初始猜值、误差、最大迭代次数)
def Newton(self, x0, E, max_count=100):
# 存放迭代过程中的所有解
ans_list = [x0]
# 最大迭代次数,避免死循环
for i in range(max_count):
# 迭代公式
ans_list.append(ans_list[i] - self.f(ans_list[i]) / self.df(ans_list[i]))
# 判断是否满足误差要求,达到直接中止迭代
if abs(ans_list[i + 1] - ans_list[i]) <= E:
break
# 返回最终迭代结果,迭代次数,迭代过程全解
return ans_list[i + 1], i + 1, ans_list
核心代码讲解:
from sympy import *
将 SymPy 中所有的功能都导入到当前命名空间中,包括常用的数学函数、符号、表达式、方程、矩阵等。这样一来,你可以直接使用这些功能而不用再使用 sympy.
这样的前缀。
x = sp.Symbol('x')
:定义一个符号变量 x
,用于表示函数中的自变量。
self.f_expr = eval(self.function_entry.get())
:从用户输入的字符串中解析函数表达式。假设用户在界面上输入了一个函数表达式,通过 self.function_entry.get()
获取用户输入的字符串,然后通过 eval()
函数将其解析成可执行的Python代码,将结果存储在 self.f_expr
中。
self.f = sp.lambdify(x, self.f_expr)
:使用 sp.lambdify()
函数将SymPy表达式 self.f_expr
转换为一个可调用的函数 self.f
。这样做是为了将SymPy的符号表达式转换为可以在数值计算中使用的函数。
self.df_expr = sp.diff(self.f_expr, x)
:求解函数 self.f_expr
对变量 x
的一阶导数。sp.diff()
函数用于对表达式求导。
self.df = sp.lambdify(x, self.df_expr)
:将一阶导数 self.df_expr
转换为一个可调用的函数 self.df
。
def Newton(self, x0, E, max_count=100):
:定义一个名为 Newton
的方法,用于执行牛顿迭代法。
ans_list = [x0]
:初始化一个列表 ans_list
,用于存放迭代过程中的所有解,并将初始猜测值 x0
添加到列表中。
for i in range(max_count):
:使用 for
循环迭代最多 max_count
次,避免死循环。
ans_list.append(ans_list[i] - self.f(ans_list[i]) / self.df(ans_list[i]))
:根据牛顿迭代法的公式更新迭代解。迭代公式即为$x_{k+1} = x_k - \frac{f(x_k)}{f'(x_k)}$,其中 self.f(ans_list[i])
表示函数在点 ans_list[i]
处的函数值,self.df(ans_list[i])
表示函数在点 ans_list[i]
处的导数值。
if abs(ans_list[i + 1] - ans_list[i]) <= E:
:判断迭代结果与上一次迭代结果之间的差值是否小于等于给定的误差 E
,如果满足条件则跳出循环,迭代结束。
return ans_list[i + 1], i + 1, ans_list
:返回迭代过程中最终得到的近似根 ans_list[i + 1]
、迭代次数 i + 1
,以及整个迭代过程中的所有解 ans_list
,用作与界面渲染数据源。
算法流程图:
1)运行程序的两种方式:可以在Python环境下运行Newton.py源文件或者直接双击运行Newton.exe程序。
2)运行程序的效果如下:
3)主体模块介绍:程序的第一行为相关数据输入框,第二行为相关操作按钮,第三行分别为函数图像、迭代值变化趋势图像,第四行为迭代值、迭代次数显示区。以下是每个输入框和按钮的作用以及输入函数的格式要求,可在程序中通过使用帮助查看:
函数表达式输入框: 请输入一个数学函数表达式,例如:$x**2+3x-5、sp.exp(x)+10x-2$。 表达式应当符合python语法,如加法(+), 减法(-), 乘法(*), 除法(/), 幂(**)。 特殊函数输入格式请参考SymPy官方文档,例如$e^x$ => exp(x),sin(x) => sin(x)
SymPy官方文档:https://docs.sympy.org/latest/tutorials/intro-tutorial/index.html#intro-tutorial
Python语法学习:https://blog.csdn.net/m0_66570338/article/details/128714062
初始猜测值输入框: 输入一个初始猜测值,作为迭代计算的起始点。 可以输入整数或小数。
误差输入框: 输入一个用于判断迭代精度的误差值。 当迭代结果与上一次迭代结果的差值小于误差时,迭代停止。
显示精度位输入框: 设置迭代过程中结果的显示精度位数。 输入一个正整数,表示显示结果的小数位数。
最大迭代次数输入框: 设置最大迭代次数,以避免迭代无限循环。 输入一个正整数,表示最大的迭代次数。
绘制函数按钮: 根据输入的函数表达式,绘制函数图像。
逐步迭代按钮: 逐步展示迭代过程的图像,并显示每次迭代的结果。
一键迭代按钮: 一次性展示所有迭代过程的图像,并显示最终的迭代结果。
重置程序按钮: 重置所有的操作记录,清空输入框和图像区域,恢复到初始状态。
4)首先按照输入格式规范为每个输入框输入初始值:
5)首先点击绘制函数按钮,程序将检测初始值输入是否有误:
如果输入有误程序将拦截后续操作:
如果无误将绘制函数表达式图像,同时解锁逐步迭代、一键迭代操作按钮:
6)可以选择逐次点击逐步迭代按钮一步步查看迭代过程值变化情况:
7)也可以点击一键迭代按钮,立即查看整个迭代过程和迭代结果:
8)如果修改了任意输入框中的值函数图像和迭代结果都将清空,需要重新绘制函数,这是为了重复检查输入值正确性。
9)可以点击重置按钮,将清空所有值
10)可以点击使用帮助,可借此查看程序相关使用说明:
11)使用小技巧:由于迭代点、切线变化可能会比较散乱或者比较密集不便于查看,由此可以尝试长按鼠标拖动查看图像或者通过滚轮放大或缩小图像查看效果。
通过滚轮放大后查看效果:
如此用起来便方便很多~
牛顿迭代法及其类似思路在实际工程问题中有着广泛的应用,特别是在需要解决非线性方程、优化问题或者求解数值逼近的情况下。以下是一些典型的应用领域:
电力系统分析:在电力系统工程中,牛顿迭代法被广泛应用于潮流计算。电力系统是一个复杂的网络,包含各种各样的电力设备,如发电机、变压器、线路等。潮流计算是电力系统分析中的核心问题之一,其主要目的是计算电力系统中各节点的电压和相角,以确定电力系统的稳态工作状态。由于电力系统的非线性特性,潮流计算问题可以建模为一个非线性方程组,其中包含了大量的功率平衡方程和节点电压方程。牛顿迭代法可以应用于求解这些非线性方程组,以实现电力系统的潮流计算。未来随着电力系统的智能化和高效化发展,牛顿迭代法在电力系统工程中的应用也将更加广泛,可能会涉及到电力系统的实时运行优化、智能调度等方面。
结构工程:在结构工程中,牛顿迭代法被广泛应用于结构分析和设计。结构工程涉及到建筑物、桥梁、飞机等各种结构的设计和分析,其中包含了大量的非线性问题,如弹性力学、塑性力学、非线性材料等。牛顿迭代法可以应用于求解这些非线性问题,以确定结构的受力状态、变形情况或者稳定性分析。未来随着结构工程的发展,牛顿迭代法可能会在更复杂的结构分析和设计中得到应用,比如在微观尺度下考虑材料的非线性行为、多物理场耦合等方面。
控制系统设计:在控制工程中,牛顿迭代法被应用于控制系统的设计和优化。控制工程涉及到控制系统的建模、分析和设计,其中包含了大量的非线性问题,如非线性控制、非线性系统等。牛顿迭代法可以应用于求解这些非线性问题,以确定控制系统的参数或者设计控制策略。未来随着控制工程的发展,牛顿迭代法可能会在自适应控制、模糊控制、深度学习控制等方面发挥更重要的作用。。
结构力学分析:在结构力学中,需要解决非线性的力学方程,如弹性力学、塑性力学等。牛顿迭代法可以用于求解这些非线性方程,以确定结构的受力状态、变形情况或者稳定性分析。
信号处理:在信号处理领域,有时需要求解非线性方程来实现信号的滤波、降噪或者分析。牛顿迭代法可以应用于这些问题的求解,以实现对信号的处理与分析。
数值优化:牛顿迭代法也可以用于求解优化问题,特别是在数值优化中,需要最小化或者最大化目标函数的情况下。通过求解目标函数的导数和二阶导数,可以利用牛顿迭代法来寻找最优解。
随着科学技术的不断进步和工程领域的不断发展,牛顿迭代法在实际工程问题中的应用前景是十分广阔的。未来我们可以期待牛顿迭代法在工程领域中的应用更加普遍和深入,可能会涉及到更多领域的问题求解和优化,比如在智能交通系统、智能制造系统、智能能源系统等方面的应用。同时,随着计算机硬件和软件技术的不断发展,牛顿迭代法的计算效率和稳定性也会得到进一步提高,为工程领域的应用提供更加可靠和高效的解决方案。因此,牛顿迭代法作为一种强大的数值方法,将继续在工程领域中发挥重要作用,推动工程技术的进步和发展。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。