MATLAB学习-牛顿迭代法的简单测验

牛顿迭代测验背景:

如果牛顿迭代的方程是f,变量为x:

我项目中用于牛顿迭代的方程十分复杂,会存在方程中有类似:
f = g ( x ) ∗ h ( x ) f =g(x)*h(x) f=g(x)h(x)
但是为了计算的方便, g ( x ) g(x) g(x)取其数值解,在计算 f f f 的导数时,假装 g ( x ) g(x) g(x) x x x 无关,这样,求出的 f f f 的导数应为:
f ′ = g ( x ) ∗ h ′ ( x ) f' =g(x)*h'(x) f=g(x)h(x)
牛顿迭代为:
x ′ = x − f / f ′ x' =x-f/f' x=xf/f
但是这样,对牛顿迭代会产生错误的影响吗?


测验示例

测验示例较为简单,只能作为参考

测验1:

clear
clc

syms x 
% 牛顿迭代中使用的方程f,其中g(x)=x,h(x)=(x-3)*(x+10)
f=x*(x-3)*(x+10);
% difff为实际f方程的导数
difff = diff(f,x)
% shudiff为假装g无关x的导数,但g为准确的对应数值
shudiff = x*(2*x+7)

num = 10; % 迭代次数
i = 1;
x0 = -25; % 牛顿迭代初始值
x1 = -25;
while i<=num
    i=i+1;
    x0 = x0-subs(f,x,x0)/subs(shudiff,x,x0);
    x1 = x1-subs(f,x,x1)/subs(difff,x,x1);
end
digits
vpa(x0) % 精确解为分数,为方便查看,改用小数
vpa(x1)

结果如下图,可以发现,这种在一定程度上可以这么进行:
测验结果
测验2:

clear
clc

syms x 
% 牛顿迭代中使用的方程f,其中g(x)=x,h(x)=(x-3)*(x+10)
f=x*(x-3)*(x+10);
% difff为实际f方程的导数
difff = diff(f,x)
% shudiff为假装g无关x的导数,但g为准确的对应数值
shudiff = x*(2*x+7)

num = 10; % 迭代次数
i = 1;
x0 = 1; % 牛顿迭代初始值
x1 = 1;
while i<=num
    i=i+1;
    x0 = x0-subs(f,x,x0)/subs(shudiff,x,x0);
    x1 = x1-subs(f,x,x1)/subs(difff,x,x1);
end
digits
vpa(x0) % 精确解为分数,为方便查看,改用小数
vpa(x1)

结果如下图,可以发现,当初始值为1时,这两种方法的牛顿迭代结果产生了偏差:
测验结果
x0结果为3,x1结果趋于0,当然,结合方程 f f f 来看,这两种结果都是正确的,只是需要注意。


其他:

一:关于 g ( x ) g(x) g(x)的选择

我个人觉得这个 g ( x ) g(x) g(x)只能选择作为乘除的一项因子,当 g ( x ) g(x) g(x)作为因子时,可以发现,方程 f f f 的实际导数和上述使用的有偏差的导数在零点的值是相同的,事实上,当解越趋近零点,这两种导数的值就越相近,而方程 f f f 的值是相同的,那么牛顿迭代求出的解相同也是一件可以理解的事情。

二:关于初始解的选择

结合 示例2 来看,可以发现,初始解的选取会影响不同方法下牛顿迭代产生的结果,但是对于我个人来说,这点不重要,因为 g ( x ) g(x) g(x)的零点是我不需要的。

存在问题:

这种简单的测验也存在不少问题,一是测验的方程太过简单,或许复杂的方程会对一点点偏差都十分敏感;二是我这样简单的分出乘除的因子真的契合我自己项目的情况吗?

记录于2024.7.29

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值