求解非线性方程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)
更多推荐
所有评论(0)