求解非线性方程f (x)= 0的MATLAB数值法指令介绍(solve、fzero的方法与实例)

一、符号方程求解

       在MATLAB中,求解用符号表达式表示的代数方程可由函数solve实现,其调用格式为:
       solve(s)(求解符号表达式s的代数方程,求解变量为默认变量,当方程右端为0时,方程可以不标出等号和0,仅标出方程的左端)
       solve(s,v)(求解符号表达式s的代数方程,求解变量为v)
       solve(s1,s2,…,sn,v1,v2,…,vn)(求解符号表达式s1,s2,…,sn组成的代数方程组,求解变量分别为v1,v2,…,vn)
       让我举个栗子
求解如下方程:
在这里插入图片描述
代码:

x=solve('2*sin(3*x-pi/4)=1')

在这里插入图片描述
代码:

x= solve('x+x*exp(x)-10', 'x')   %仅标出方程的左端

二、求方程f ( x ) = 0数值解的基本方法

       并非所有的方程 f ( x ) = 0 都能求出精确解或解析解,存在这种解的方程就需要用数值解法求出近似解,有几种常见的数值解法:

       1.二分法

       2.迭代法:切线法、割线法(弦截法)

注:二分法简单方便,但收敛速度慢;
       迭代法虽然收敛速度稍微快点,但需要判断能否收敛;
       只要初值选取得当,切线法具有恒收敛且收敛速度快的优点,但需要求出函数的导数;
       弦截法不需要求导数,特别是前面介绍的快速弦截法,收敛速度很快,但是需要知道两个近似的初始根值才能作出弦,要求的初始条件较多。

三、方程f(x) = 0数值解的MATLAB实现

       MATLAB中求方程数值解的办法很多,有的是专用指令,有的是根据方程性质而借用其他专用指令求得的

       这里我们就先介绍求函数零点指令fzero吧

       求解方程f ( x ) = 0的实数根也就是求函数f ( x)的零点。MATLAB中设有求函数f (x)零点的指令fzero,可用它来求方程的实数根。该指令的使用格式为:fzero (fun, x0, options)
       ①输入参数fun为函数f (x)的字符表达式、内联函数名或M函数文件名。
       ②输入参数x0为函数某个零点的大概位置(不要取零)或存在的区间[xi,xj],要求函数f (x)在x0点左右变号,即f (xi)f (xj) < 0。
       ③输入参数options可有多种选择,若用optimset (‘disp’, ‘iter’)代替options 时,将输出寻找零点的中间数据。
       ④该指令无论对多项式函数还是超越函数都可以使用,但是每次只能求出函数的一个零点,因此在使用前需摸清函数零点数目和存在的大体范围。为此,一般先用绘图指令plot, fplot或ezplot画出函数f (x)的曲线,从图上估计出函数零点的位置。
       让我再举个栗子
如:求方程 x^2 + 4sin(x) = 25 的实数根(-2π<x < 2π)
解:
1)若fun为函数f (x)的字符表达式
       ①首先要确定方程实数根存在的大致范围。为此,先将方程变成标准形式f(x) =x2 + 4sin(x) - 25 = 0,作f(x)的曲线图:

x=-2*pi:0.1:2*pi;
f=x.^2+4*sin(x)-25;
plot(x,f);grid on;

在这里插入图片描述
从曲线上可以看出,函数的零点大约在x1= - 4和x2=5附近
       ②直接使用指令fzero求出方程在x1≈ - 4时的根

x1= fzero ('x^2+4*sin(x)-25',-4)

       若键入:

fzero ('x^2+4*sin(x)-25',-4, optimset('disp', 'iter'))

       将会显示迭代过程
       中间数据表明,求根过程中不断缩小探测范围,最后得出- 4附近满足精度的近似根
       ③求x2≈ 5的根:

x2= fzero ('x^2+4*sin(x)-25',5)

(2) 若fun为函数f (x)的M函数文件名
将方程x2 + 4sin(x) = 25编成M函数文件(实用中在函数较为复杂、而又多次重复调用时,才这样做),用fzero求解。
       ①在M文件编辑调试窗中键入:

function  yy=fan (x)
yy= x^2+4*sin(x)-25;

       以fan为文件名存盘,退出编辑调试窗,回到指令窗。
       ②确定根的大体位置;
       ③在指令窗中键入下述指令可求出 - 4 附近的根:

x1= fzero ('fan',-4)

       键入下述指令可求出5附近的根:

x2= fzero ('fan',5)

       我还要再举个栗子
如:求f(x)=x-10^x+2=0在x0=0.5附近的根
解:

x=-2.5:0.01:0.5;
fx=x-10.^x+2;
plot(x,fx)

在这里插入图片描述

       从f(x)的曲线看出曲线的零点有两个,一个在x=-2附近,另一个在x=0.5附近
       ①建立函数文件funx.m。(function [输出变量列表]=函数名(输入变量列表))

functionfx=funx(x)
fx=x-10.^x+2;

       ②调用fzero函数求根。

   z=fzero('funx',0.5)
  • 19
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值