Matlab求解方程或函数的根,root,fzero,solve,fsolve的区别

1.引言

Matlab中有很多求解方程和方程组的函数,这些函数的使用可能有很多人都模棱两可,这里做一个简单的介绍,给个大方向,学会这些函数的基本使用场景。想要学习每个函数的更多细节和案例,Matlab官方帮助文档是最好的材料。假传万卷书,真传一案例,我们一起用例子来学习,走你~

2.四个函数

四个函数中用到了函数名字函数句柄这两个概念,我们分别说明下。所谓函数名字就是函数变量名左右加上单引号,使其成为字符串,例如你在func.m中定义了一个名为为func的函数(function f=func(x)),那么它的函数名字就是'func'。至于函数句柄,简单理解就是一个函数指针,用@func来获取。匿名函数的结果直接就是一个函数句柄,例如f=@(x)x^2+1得到的f本身就是一个函数句柄了。

2.1 root

root函数针对的是多项式求根问题,如下

% 求解x^3-2*x^2+x+1=0;
p=[1,-2,1,1];
roots(p)
2.2 fzero

一元非线性函数求根推荐使用fzero
语法:x=fzero(f,x0),其中f为函数名字或者函数句柄。函数名字和函数句柄是什么请看上面。x0是根的一个初始猜测值或者猜测范围,如果是猜测范围,x0的定义就是[-1,1]这样子的。

% 案例一: 求解exp(x)+cos(x)=0
f=@(x)exp(x)+cos(x);
% 第一个参数是函数名字,或者函数句柄。第二个参数是其实猜测值或者猜测区间
fzero(f,0)

% 案例二: 
% 在function.m中定义一个名为function的函数
fzero('function',0)
% 或者
fzero(@function,0)
% 都可以求出函数的根
2.3 fsolve

多元/多维情况下,非线性方程组的求解用fsolve

% 求解方程组 x^2+y-4=0, x-y-10=0
% 在test.m中定义如下函数
function r = test(x)
    r(1)=x(1).^2+x(2)-4;
    r(2)=x(1)-x(2)-10;
end

% 使用函数名或者函数句柄
fsolve('test',[0,0])
% 或者
fsolve(@test,[0,0])
2.4 solve

还有个比较特殊的存在就是solve函数,它也可以进行函数的求根和方程的求解,而且它能做到远远不止这些,还可以进行优化。在进行函数求根或者方程求解时,它与其他上面三个函数显著不同的地方是,它针对的函数是符号函数或者等式,下面分别举例:

syms x;
f = x^3+2*x^2-x+1;
s = solve(f); % f为符号函数,当不采用包含等式==的方程时,默认求根,否则求方程的解
double(s)

% solve的第一个参数是等式时
s = solve(x^3+2*x^2==x-1)
double(s) %结果同上
2.5 其他

上述函数求根时,有时需要提供一个初始猜测,例如fzerofsolve函数。所以一般最好先大致画一下函数看看解的大致范围,具体绘画函数的函数大概有以下这么几个,都可以简单尝试下

f = @(x,y) x.*exp(-x.^2-y.^2)+(x.^2+y.^2)/20;
g = @(x,y) x.*y/2+(x+2).^2+(y-2).^2/2-2;
% 隐函数绘制
fimplicit(g,'k')
axis([-6 0 -1 7])
hold on
% 等值线绘制
fcontour(f)
% 三维曲面绘制
figure;
fsurf(f)

总结

这几个函数看起来都很相似,不仔细对比一下总是傻傻分不清,笔者也是饱受困扰所以花了点时间分类对比了一下,希望对你有帮助。如果你是注册登录状态,点个赞或者评论就更棒了!

posted on 2023-02-28 09:24  BabyStep  阅读(553)  评论(0编辑  收藏  举报

导航