第7章 求解非线性方程7.1 多项式运算在MATLAB 中的实现一、多项式的表达n 次多项式表达为:n a +⋯⋯++=x a x a x a p(x )1-n 1-n 1n 0,是n+1项之和 在MATLAB 中,n 次多项式可以用n 次多项式系数构成的长度为n+1的行向量表示[a0, a1,……an-1,an]二、多项式的加减运算 设有两个多项式na +⋯⋯++=x a x a x a p1(x )1-n 1-n 1n 0和m b +⋯⋯++=x b x b x b p2(x )1-m 1-m 1m 0。
它们的加减运算实际上就是它们的对应系数的加减运算。
当它们的次数相同时,可以直接对多项式的系数向量进行加减运算。
当它们的次数不同时,应该把次数低的多项式无高次项部分用0系数表示。
例2 计算()()1635223-+++-x x x x a=[1, -2, 5, 3]; b=[0, 0, 6, -1]; c=a+b例3 设()6572532345++-+-=x x x x x x f ,()3532-+=x x x g ,求f(x)+g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; g1=[0, 0, 0, g];%为了和f 的次数找齐f+g1, f-g1三、多项式的乘法运算 conv(p1,p2)例4 在上例中,求f(x)*g(x) f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; conv(f, g)四、多项式的除法运算[Q, r]=deconv(p1, p2)表示p1除以p2,给出商式Q(x),余式r(x)。
Q,和r 仍为多项式系数向量 例4 在上例中,求f(x)/g(x) f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; [Q, r]=deconv(f, g) 五、多项式的导函数p=polyder(P):求多项式P 的导函数 p=polyder(P,Q):求P·Q 的导函数[p,q]=polyder(P,Q):求P/Q 的导函数,导函数的分子存入p ,分母存入q 。
参数P,Q 是多项式的向量表示,p,q 也是多项式的向量表示。
例4 求有理分式()100765105853*********--+++-+-+=x x x x x x x x x x f 的导函数P=[3, 5, 0, -8, 1, -5]; %有理分式分子 Q=[10, 5, 0, 0, 6, 0, 0, 7, -1, 0, -100]; %有理分式分母 [p,q]=polyder(P,Q) 六、多项式求根多项式求根就是求满足多项式p(x)=0的x 值。
N 次多项式应该有n 个根。
这些根可能是实根,也可能是若干对共轭复根。
其调用格式是x=roots(P)其中P 为多项式的系数向量,求得的根赋给向量x ,即x(1),x(2),…,x(n)分别代表多项式的n 个根。
该命令每次只能求一个一元多项式的根,该指令不能用于求方程组的解,必须把多项式方程变成P n (x) = 0的形式;例4 求方程123+=x x 的解。
首先将方程变成P n (x) = 0的形式:0123=--x xroots([1 -1 0 -1])例5 求多项式x 4+8x 3-10的根。
A=[1,8,0,0,-10]; x=roots(A)若已知多项式的全部根,则可以用poly 函数建立起该多项式,其调用格式为:P=poly(x)若x 为具有n 个元素的向量,则poly(x)建立以x 为其根的多项式,且将该多项式的系数赋给向量P 。
例6 已知 f(x)=3x 5+4x 3-5x 2-7.2x+5 (1) 计算f(x)=0 的全部根。
(2) 由方程f(x)=0的根构造一个多项式g(x),并与f(x)进行对比。
P=[3,0,4,-5,-7.2,5];X=roots(P) %求方程f(x)=0的根 G=poly(X) %求多项式g(x) 将这个结果乘以3,就与f(x)一致7.2 求解非线性方程f ( x ) = 0方程求根的一般形式是求下列方程的根:f ( x ) = 0 (l)实际上,就是寻找使函数 f ( x )等于零的变量x ,所以求方程(l )的根,也叫求函数 f ( x )的零点。
如果变量x 是列阵,则方程(l )就代表方程组。
当方程(l )中的函数 f (x )是有限个指数、对数、三角、反三角或幂函数的组合时,则方程(l )被称为超越方程,例如 e -x - sin (πx / 2 ) +lnx = 0 就是超越方程。
当方程(l )中的函数f (x )是多项式时,即 f (x )=P n (x )= a n x n + a n-1x n + … + a l x + a 0,则方程(l )就成为下面的多项式方程,也称代数方程:P n (x )= a n x n + a n-1x n + … + a l x + a 0 = 0 ( 2 )P n (x )的最高次数n 等于2、3时,用代数方法可以求出方程(2)的解析解,但是,当n ≥ 5时,伽罗瓦(Galois )定理已经证明它是没有代数求根方法的。
至于超越方程,通常很难求出其解析解。
所以,方程(l )的求解经常使用作图法或数值法,而计算机的发展和普及又为这些方法提供了广阔的发展前景,使之成为科学和工程中最实用的方法之一。
本章首先介绍求解 f ( x ) = 0 的 MATLAB 符号法指令,然后介绍求方程数值解的基本原理,最后再介绍求解 f ( x ) = 0 的 MATLAB 数值法指令。
一、符号方程求解在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 。
例1. 解下列方程。
1.22144212-+=-++x x x x x= solve('1/(x+2)+4*x/(x^2-4)=1+2/(x-2)', 'x')2.17433=---x x x f=sym('x-(x^3-4*x-7)^(1/3)=1') x= solve(f)3.143sin 2=⎪⎭⎫ ⎝⎛-πxx= solve('2*sin(3*x-pi/4)=1') 4.010=-+x xe xx= solve('x+x*exp(x)-10', 'x') %仅标出方程的左端 二、求方程f ( x ) = 0数值解的基本方法并非所有的方程 f ( x ) = 0 都能求出精确解或解析解,不存在这种解的方程就需要用数值解法求出近似解,有几种常见的数值解法基本原理:二分法。
1 求实根的二分法原理设方程 f (x) =0中的函数 f ( x )为实函数,且满足:① 函数 f (x )在[ a , b]上单调、连续;② 方程 f (x) = 0 在(a , b )内只有一个实根 x*。
则求方程 f (x) = 0 的根,就是在(a, b )内找出使f (x )为零的点x*:f (x*) = 0 ,即求函数 f ( x ) 的零点。
因为 f (x )单调连续,由连续函数的性质可知,若任意两点aj ,bj ∈[ a , b] ,而且满足条件 f (aj) f (bj) < 0 ,则闭区间[aj , bj] 上必然存在方程的根x*,即 x*∈[aj , bj]。
据此原理提出求实根的二分法如下图所示,图1 方程求根二分法原理示意图先用中点21ba b +=将区间[a, b]平分为两个子区间 (a,b 1)和(b 1, b),方程的根必然在子区间两端点上函数值之积小于零的那一半中,即不在(a ,b 1)内,就在(b 1 ,b )内,除非 f(b 1) = 0 ,于是寻根的范围缩小了一半。
图1中的根x*在区间中点左侧,即 x*∈(a , b l )。
再将新的含根区间( a , b 1)分成两半,重复上述步骤确定出更新的含根子区间。
如此重复n 次,设含根区间缩小为(a n , b n ),则方程的根x*∈(a n , b n ), 这一系列含根的子区间满足:( a , b ) D ⊃ ( a l , b l ) ⊃ ( a 2 , b 2 ) ⊃ … ⊃ ( a 0, b 0)⊃ …由于含根区间范围每次减半,子区间的宽度为n n n ab a b 2-=- (n = 1,2,….),显然当n →∞时,(b n 一a n )→0,即子区间收敛于一点x*,这个点就是方程的根。
若n 为有限整数,取最后一个子区间的中点2nn n b a x +=作为方程根的近似值,它满足 f ( x n )≈0 ,于是有:12221*+-=-⋅≤-n n n a b a b x x 这就是近似值x n 的绝对误差限。
假定预先要求的误差为ε,由12+-<n ab ε便可以求出满足误差要求的最小等分次数n 。
下面是二分法的程序function [c,err,yc] =bisect (f,a,b,delta)%Input - f is the function input as a string ‘f ’ % - a and b are the left and right end points %. - delta is the tolerance %Output - c is the zero % - yc=f(c)% - err is the error estimate for c ya=feval (f,a); yb=feval (f,b);if ya*yb>0, break, end %表示无解,结束maxl=l+round( (log (b-a) -log (delta))/log (2)); %从误差表达式得到最小等分次数n for k=1:max1c=(a+b)/2; %取区间中点 yc=feval (f,c); if yc==0 a=c;b=c; %这时解已经找到 elseif yb*yc>0 b=c; %区间减半 yb=yc; else •a=c; ya=yc; endif b-a < delta, break, end endc=(a+b)/2; err=abs(b-a); yc=feval (f, c)2 迭代法迭代法是计算数学中的一种重要方法,用途很广,求解线性方程组和矩阵特征值时也要用到它。