📄 解各种方程.txt
字号:
8.2 非线性方程式的实根
----------------------------------------------------------------------------
--
--
如果求根的方程式不为多项式的形态 就不能用 roots 函数。而这类的方策’h半是非线
性方程式, 其函数形态变化很大。对于解这类方程式的根,可以用 fzero函数,它其实
是用来找一函数 f(x) 的 x 值代入时,会使该函数值为零 (f(x)=0);而这也就是根的
特
性,因此我们可以用 fzero求根。
要求任一方程式的根有三步骤:
先定义方程式。要注意必须将方程式安排成 f(x)=0 的形态,例如一方程式为sin(x)=3
,
则该方程式应表示为 f(x)=sin(x)-3。可以 m-file 定义方程式。
代入适当范围的 x, y(x) 值,将该函数的分布图画出,藉以了解该方程式的「长相」。
由图中决定y(x)在何处附近(x0)与 x 轴相交,以fzero的语法fzero('function',x0) 即
可求出在 x0附近的根,其中 function 是先前已定义的函数名称。如果从函数分布图看
出根不只一个,则须再代入另一个在根附近的 x0,再求出下一个根。
以下分别介绍几数个方程式,来说明如何求解它们的根。
例一、方程式为
sin(x)=0
我们知道上式的根有 ,求根方式如下:
> > r=fzero('sin',3) % 因为sin(x)是内建函数,其名称为sin,因此无须定义它
r = % 选择 x=3 附近求根
3.1416
> > r=fzero('sin',6) % 选择 x=6 附近求根
r =
6.2832
例二、方程式为先前提到的 MATLAB 内建函数 humps,我们不须要知道这个方程式的形
态
为何,不过我们可以将它划出来,再找出根的位置。求根方式如下:
> > x=linspace(-2,3);
> > y=humps(x);
> > plot(x,y), grid % 由图中可看出在0和1附近有二个根
> > r=fzero('humps',1.2)
r =
1.2995
例三、方程式为
这个方程式其实是个多项式,我们说明除了用 roots 函数找出它的根外,也可以用这节
介绍的方法求根,注意二者的解法及结果有所不同。求根方式如下:
% m-function, f_1.m
function y=f_1(x) % 定义 f_1.m 函数
y=x.^3-2*x-5;
> > x=linspace(-2,3);
> > y=f_1(x);
> > plot(x,y), grid % 由图中可看出在2和-1附近有二个根
> > r=fzero('f_1',2); % 决定在2附近的根
r =
2.0946
> > p=[1 0 -2 -5]
> > r=roots(p) % 以求解多项式根方式验证
r =
2.0946
-1.0473 + 1.1359i
-1.0473 - 1.1359i
例四、方程式为
求根方式如下:
% m-function, f_2.m
function y=f_2(x) % 定义 f_2.m 函数
y=x.^2.*sin(x)+cos(x);
> > x=linspace(-3,3);
> > y=f_2(x);
> > plot(x,y), grid % 由图中可看出在-1和3附近有二个根
> > r=fzero('f_2',-1); % 决定在-1附近的根
r =
-0.8952
> > r=fzero('f_2',3); % 决定在3附近的根
r =
3.0333
例五、方程式为
求根方式如下:
% m-function, f_3.m
function y=f_3(x) % 定义 f_3.m 函数
y=2*exp(-x).*sin(2*pi*x)-0.5;
> > x=0:0.1:2; y=f_3(x);
> > plot(x,y), grid % 由图中可看出在0,0.5和1附近有三个根
> > r=fzero('f_3',0) % 决定在0附近的根
r =
0.0420
> > r=fzero('f_3',0.5) % 决定在0.5附近的根
r =
0.4368
> > r=fzero('f_3',1) % 决定在1附近的根
r =
1.1435
----------------------------------------------------------------------------
--
9.1.1 梯形法
----------------------------------------------------------------------------
--
--
MATLAB提供最简单的积分函数是梯形法trapz,我们先说明梯形法语法trapz(x,y),其中
x,y分别代表数目相同的阵列或矩阵,而y与x的关系可以由是一函数型态(如y=sin(x))
或是不以函数描述的离散型态(像第八章介绍的x与y皆为离散点)。
我们看一简单积分式
以下为 MATLAB 的程式
> > x=0:pi/100:pi;
> > y=sin(x);
> > k=trapz(x,y)
k =
1.9998
----------------------------------------------------------------------------
--
9.1.2 二次函数法
----------------------------------------------------------------------------
--
--
MATLAB 另外提供二种积分函数,它们分别是辛普森法 quad 和牛顿-康兹法 quad8。三
种
方法的精确度由低而高,分别为 trapz, quad, quad8。
由于这二种方法依据的积分法不同于梯形法,因此它们的语法就和 trapz 不同;其语法
为 quad('function',a,b) (quad8语法相同),其中function是一已定义函数的名称(
如sin, cos, sqrt, log 等),而 a, b是积分的下限和上限。和 trapz比较,quad,
quad8不同之处在于这二者类似解析式的积分式,只须设定上下限及定义要积分的函数;
而 trapz则是针对离散点型态的数据做积分。
我们看一简单积分式
以下为 MATLAB 的程式
> > a=0; b=0.5;
> > kq=quad('sqrt',a,b)
kq =
0.2357
> > kq8=quad8('sqrt',a,b)
kq8 =
0.2357
再来看一个较复杂的积分式
> > x=-1:0.17:2;
> > y=humps(x);
> > area=trapz(x,y)
area =
25.9174
> > x=-1:0.07:2;
> > y=humps(x);
> > area=trapz(x,y)
area =
26.6243
> > area=quad('hump',-1,2)
area =
26.3450
> > area=quad8('hump',-1,2)
area =
26.3450
----------------------------------------------------------------------------
--
9.3.1 差分表示法
----------------------------------------------------------------------------
--
--
我们知道一微分项的计算,可以在二相邻点 x+h 和 x 间函数取下列极限求得
若将原连续的空间以多个离散点取代,即是。则上述的极限以离散点的方式计算,即是
以
下的差分式 (difference equation)
其中,而上式被称为前向差分,因为是以为参考点,另一点在它之前。上式的几何意义
是
以二点函数值计算在的斜率。事实上,除了上式可计算在的微分值外,也可以下列二式
计
算
而高阶微分项可以利用低阶微分项来计算,举例来说一个二阶微分式可以表示为
所以对应的差分式有
----------------------------------------------------------------------------
--
9.3.2 差分函数
----------------------------------------------------------------------------
--
--
上述提及的后向差分式,在 MATLAB 有对应的diff 函数来计算二相临点的差值,它的语
法为 diff(x),其中 x代表一组离散点 。假设有x, y(x)的数据为
x=[1 3 5 7 9], y=[1 4 9 16 25]
则 diff(x)=[2 2 2 2], diff(y)=[3 5 7 9],注意二者皆以后向差分计算且数据点只剩
4 个而不是5个。而的数值微分则为 dy=diff(y)./diff(x)。
因此要计算下列多项式在 [-4, 5] 区间的微分
可依以下方式求解
> > x=linspace(-4,5); % 产生100个x的离散点
> > p=[1 -3 -11 27 10 -24];
> > f=polyval(p,x);
> > plot(x,f) % 将多项式函数绘图
> > title('Fifth-deg. equation')
> > dfb=diff(f)./diff(x); % 注意要分别计算diff(f)和diff(x)
> > xd=x(2:length(x)); % 注意只有99个df值,而且是对应x2,x3,...,x100的点
> > plot(xd,dfb ) % 将多项式的微分项绘图
> > title('Derivative of fifth-deg. equation')
假设我们要找出上述多项式的局部极值(local critical value),可以利用局部极值所
在
点的微分为零,所以在这个点的左侧及右侧的二点微分值一定是一正一负,因此这二点
的
微分值相乘为负值,可针对此性质找出局部极值所在点。以原多项式的数据示范如下:
> > product=dfb(1:length(dfb)-1).*dfb(2:length(dfb)); % 注意二相临点值相乘的
写
法
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -