牛顿迭代测验背景:
如果牛顿迭代的方程是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′=x−f/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