Matlab实现 牛顿迭代法&&埃特金加速法 求方程的数值解

不是所有方程都可以用纸、笔以中小学生姿势解出来的,于是就有了计算机实现下的迭代方法(当然,中小学生也可以用纸笔迭代出来)

问题:解较难的方程f(x)=0

解决思路:构造迭代格式,用迭代法解出数值解

迭代格式:f(x)=0 等价于 x=f(x)+x

        ~~~~~~~        此时,左端g(x)=f(x)+x即可称作迭代函数,是诸多迭代格式中的一种。
牛顿迭代法:
(1)取初始点x_0、最大迭代次数N和精度要求ep,取k=0
(2)判断f^’ (x_k)是否为零。为零,停止计算;不为零,计算
x_(k+1)=x_k-(f(x_k))/(f^’ (x_k))
(3)若|x_(k+1)-x_k| (4)若k=N,则停止计算;否则,置k=k+1,转(2)

牛顿迭代法
function [x,n]=Newtonfun(f,x0,eps)
if (nargin==2)
    eps=1e-5;
end
df=diff(sym(f));
x1=x0;n=0;err=0.1;
while err>eps
    n=n+1;
    fx=subs(f,x1);
    df=subs(df,x1);
    x=x1-fx/df;
    err=abs(x-x1);
    x1=x;
end
end

注:牛顿迭代法很依赖初始值的选取,意思就是说:初值选的不够接近真值,结果会很不妙。(如果阁下非“自有妙计”的山人的话)还是考虑下面的埃特金加速法吧,它不会跟你计较初值这点事的

function [x0,index,k]=Aitken(f,x0)
index=0;k=0;
for i=1:1:100
    x1=feval(f,x0);
    x2=feval(f,x1);
    D=x2-2*x1+x0;
    if abs(D)>eps
        xd=(x1-x2)^2/D;
        x0=x2-xd;
        if abs(xd)<1e-5
            k=i;
            index=1;
            break;
        end
    end
end

注:在不理解源代码的情况下,抄作业会很容易出现问题的。
如果有报错,考虑输入参数函数f 在命令行窗口是以什么样的方式定义的,inline?还是syms?要对上各个函数定义里的形式才行。

如果结果有偏差,考虑输入参数函数f是f(x)?还是g(x)?,如果认真看了,认真学了,就知道我在说什么。

你可能感兴趣的:(MATLAB,Matlab,牛顿迭代法,埃特金加速法)