非线性方程

一、区间二分法

例如用区间二分法求方程x5+3x-1=0的最小正根,要求误差不超过1/2×10-2

function x =Bisection()
%区间二分法
s=input('请输入函数表达式:f = ','s');
f=inline(s);
a = input('请输入区间左端点:a=');
b = input('请输入区间右端点:b=');
eps=input('请输入停止精度要求:eps='); 
while(f(a)*f(b)>0)
    a = input('请再次输入区间左端点:a=');
    b = input('请再次输入区间右端点:b=');
end
if(f(a)==0)
    x=a;
elseif(f(b)==0)
    x=b;
else
    x=(a+b)/2.0;
    while(abs(b-x)>eps)
    if(f(a)*f(x)<0)
        b=x;
        x=(a+b)/2.0;
    elseif(f(b)*f(x)<0)
        a=x;
        x=(a+b)/2.0;
    else
        break;
    end
end
end
fprintf('结果为: ');
 
end

结果截图:

二、牛顿迭代法

用迭代法解非线性方程4x3+x-1=0 ,要求精度达到10-3(初值取0.6)

syms x;%定义符号常量
f=input('请输入函数表达式:f=');
Xo=input('请输入初值:');
eps=input('请输入精度:');
ff=diff(f);%diff求一阶偏导数
if(subs(ff,'x',Xo)~=0) %subs函数是将Xo的值代替ff中x,并计算出结果   
    X1=Xo-subs(f,'x',Xo)/subs(ff,'x',Xo);
    while(abs(X1-Xo)>eps)%abs函数是求绝对值
        Xo=X1;
        if(subs(ff,'x',Xo)~=0)
            X1=Xo-subs(f,'x',Xo)/subs(ff,'x',Xo);
        end
        if(X1>10^10)
            fprintf('函数发散');
            break;
        end
    end
    fprintf('结果为:%f',X1);
end

本题是牛顿迭代法实现的,牛顿迭代法的公式如下:

这个题呢,我当时写了很久,因为按照思路去写总是会报错,然后发现要定义符号常量才能进行后面的操作,但是迭代计算的时候又发现压根算不出来,去网上找了很多发现要用subs函数才好实现符号常量的计算,想要了解subs函数具体用法的可以自行去搜索。

结果截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值