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|<ep,则停止计算
(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)?,如果认真看了,认真学了,就知道我在说什么。

  • 13
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值