Matlab中提供了许多求解非线性方程( y=f(x) )的函数,刚开始使用,真的非常困惑,所有,这里根据matlab的help文档对这些函数做一些小小的总结
用来求解非线性方程组: F(x)=0 ;其中, x 是一个向量或者矩阵, F(x) 的返回值是一个vector,下面是具体用法(以x0为初始点,利用优化算法寻找函数fun(x)与y=0的交点,即fun(x) = 0的根):
局限性:只能求解距离给定初始值最近的那个根
function y = fun(x)
y = x^2+x-6;
end
初值为-1时:
x = fsolve(@fun,-1)
结果为:result=-3
初值为2时:
x = fsolve(@fun,2)
结果为:result=2可以看到,当给定的初始值不同时,fsolve的返回值不同,这是因为,fsolve返回的是距离给定初始点较近的那个根(fsolve在计算时,由初始点开始,逐步向零点逼近,当找到零点值后,优化停止,所以,这样的方式只能返回距离给定初始值x0最近的那个零点)
这里在求解根的时候,所有的优化参数都是使用的默认值,但实际上,优化参数可以通过options进行设置,可以设置具体优化方法(Algorithm)、是否显示每步迭代的结果(Display)、最大迭代步数(MaxIter)等, 设置方法如下:
options = optimoptions('','','')
x = fsolve(@fun,2,options )
function y = fun(x)
y(1) = x(1)^2+x(1)-6;
y(2) = 2*x(2)^2+x(2)-6;
end
初值为[-1,1]时:
x = fsolve(@fun,[-1,1])
结果为:result=[-3,1]
初值为[2,-1]时:
x = fsolve(@fun,2)
结果为:result=[2,-2]
用来求解非线性方程的根 f(x)=0 ;该函数通过判断 f(x) 的符号是否发生变化来计算方程的根
具体地,如果x0是方程的根,那么,该函数在点 x0+Δ 和 x0−Δ 处的函数值符号一定相反,所以,该函数不能用来求解类似于 x2=0 这样的方程
局限性:只能求解距离给定初始值最近的那个根(与fsolve的局限性形同)
下面给出一个例子:
function y = fun(x)
y = x^2+x-6;
end
初值为-1时:
x = fzero(@fun,-1)
结果为:result=-3
初值为2时:
x = fzero(@fun,2)
结果为:fzero=2
初值为区间[-5,5]时:
x = fzero(@fun,[-2,5])
结果为:fzero=2
注意:当给定fzero为初识区间时,要求fun函数在区间的两个端点的符号不同
可以看到,利用该方法求得的结果与利用fsolve的结果相同,也是只能返回距离给定初始值较近的那个根
这里的options参数与fsolve的设置方法相同,例如:
options = optimoptions('','','')
x = fzero(@fun,2,options )
该函数用来求解多项式方程的根,roots可以返回多项式函数的所有根,例如,计算如下多项式方程的根:
使用方法如下:
roots([1 0 0 2])
这里的[1 0 0 -2]分别是 x3 、 x2 、 x1 、 x0 的系数,结果为:
-1.2599 + 0.0000i
0.6300 + 1.0911i
0.6300 - 1.0911i
该函数用来求解符号多项式方程的根,root可以返回符号多项式函数的所有符号根,例如,计算如下多项式方程的根:
使用方法如下:
syms x
p = x^3 + 2;
result = root(p,x)
% or result = root(x^3 + 2,x)
结果为:
result =
root(x^3 + 2, x, 1)
root(x^3 + 2, x, 2)
root(x^3 + 2, x, 3)
该结果是符号计算结果(即result是符号变量),如果只是需要该结果作为中间过程,那么直接将result带入其他计算过程即可,但如果需要该result的数值结果,那么可以使用vpa函数,具体地:
result_vpa = vpa(result)
结果如下:
result_vpa =
-1.2599210498948731647672106072782
0.62996052494743658238360530363911 + 1.0911236359717214035600726141898i
0.62996052494743658238360530363911 - 1.0911236359717214035600726141898i
这三个数值就是多项式方程 fun=x3+2=0 的三个根
可以看到,与roots的计算结果相同
fsolve:计算非线性方程组的某个根(距离初始值较近的)
fzero:计算非线性方程的某个根(距离初始值较近那个)
roots:计算多项式方程的所有根
root:计算符号多项式方程的所有根
绘制函数曲线explot(fun)
默认的显示区间是[-2pi, 2pi]
实际中,可以设置显示区间,利用explot(fun,[xmin,xmax])
绘制’显示函数’曲线( y=x2 )
eg1: figure;explot('x^2')
结果如下:
可以看到,由于没有指定曲线的x取值范围,所以是默认值[-6.28,6.28]
eg2: figure;explot('x^2',[-1,1])
结果如下:
可以看到,由于设定了区间[-1,1],所以x轴只在区间[-1,1]内显示
绘制’显示函数’曲线( x2−y=0 )
eg1: figure;explot('x^2-y')
结果如下:
可以看到,由于没有指定曲线的x取值范围,所以是x、y轴的默认值都是[-6.28,6.28]、[-6.28,6.28]
eg2: figure;explot('x^2',[-1,1,-1,1])
结果如下:
可以看到,由于设定了区间[-1,1,-1,1],所以x轴、y轴在区间[-1,1,-1,1]内显示
利用函数句柄
首先,定义函数句柄
fh = @(x,y) x.^2 + y.^3 - 2*y - 1;
然后利用ezplot绘制该函数
ezplot(fh)
axis equal
实验结果如下:
加入区间限制后
ezplot(fh[-10,10,-10,10])
axis equal
实验结果如下:
可以看到,只显示了区间[-10,10,-10,10]的图像