本章主要介绍方程根的有关概念,求方程根的步骤,确定根的初始近似值的方法(作图法,逐步搜索法等),求根的方法(二分法,迭代法,牛顿法,割线法,米勒(Müller)法和迭代法的加速等)及其MATLAB程序,求解非线性方程组的方法及其MATLAB程序.
第二章 非线性方程(组)的数值解法
2.1 方程(组)的根及其MATLAB命令
2.1.2 求解方程(组)的solve命令
求方程f(x)=q(x)的根可以用MATLAB命令:
>> x=solve('方程f(x)=q(x)',’待求符号变量x’)
求方程组fi(x1,…,xn)=qi(x1,…,xn) (i=1,2,…,n)的根可以用MATLAB命令:
>>E1=sym('方程f1(x1,…,xn)=q1(x1,…,xn)'); ……………………………………………………. En=sym('方程fn(x1,…,xn)=qn(x1,…,xn)'); [x1,x2,…,xn]=solve(E1,E2,…,En, x1,…,xn)
2.1.3 求解多项式方程(组)的roots命令
如果f(x)为多项式,则可分别用如下命令求方程f(x)?0的根,或求导数f'(x)(见表 2-1).
表 2-1 求解多项式方程(组)的roots命令 命 令 xk =roots(fa) 功 能 输入多项式f(x)的系数fa(按降幂排列),运行后输出xk为f(x)?0的全部根. 输入多项式f(x)的系数fa(按降幂排列),运行后输出dfa为多项式f(x)的导数f(x)的系数. 输入多项式f(x)的导数f(x)的系数dfa(按降幂排列),运行后输出dfx为多项式f(x)的导数f'(x). ''dfa=polyder(fa) dfx=poly2sym(dfa) 2.1.4 求解方程(组)的fsolve命令
如果非线性方程(组)是多项式形式,求这样方程(组)的数值解可以直接调用上面已经介绍过的roots命令.如果非线性方程(组)是含有超越函数,则无法使用roots命令,需要调用MATLAB系统中提供的另一个程序fsolve来求解.当然,程序fsolve也可以用于多项式方程(组),但是它的计算量明显比roots命令的大.
fsolve命令使用最小二乘法(least squares method)解非线性方程(组)
F(X)?0
的数值解,其中X和F(X)可以是向量或矩阵.此种方法需要尝试着输入解X的初始值(向量或矩阵)X0,即使程序中的迭代序列收敛,也不一定收敛到F(X)?0的根(见例2.1.8).
fsolve的调用格式: X=fsolve(F,X0)
输入函数F(x)的M文件名和解X的初始值(向量或矩阵)X0,尝试着解方程(组)
F(X)?0,运行后输出F(X)?0解的估计值(向量或矩阵)X.
要了解更多的调用格式和功能请输入:help fsolve,查看说明.
2.2 搜索根的方法及其MATLAB程序
求解非线性方程根的近似值时,首先需要判断方程有没有根?如果有根,有几个根?如果有根,需要搜索根所在的区间或确定根的初始近似值(简称初始值).搜索根的近似位置的常用方法有三种:作图法、逐步搜索法和二分法等,使用这些方法的前提是高等数学中的零点定理.
2.2.1 作图法及其MATLAB程序
作函数的图形的方法很多,如用计算机软件的图形功能画图,或用高等数学中应用导数作图,或用初等数学的函数叠加法作图等.下面介绍两种作图程序.
作函数y?f(x)在区间 [a,b] 的图形的MATLAB程序一
x=a:h:b; % h是步长 y=f(x); plot(x,y) grid, gtext('y=f(x)')
说明:⑴ 此程序在MATLAB的工作区输入,运行后即可出现函数y?f(x)的图形.此图形与x轴交点的横坐标即为所要求的根的近似值.
⑵ 区间[a,b] 的两个端点的距离 b-a 和步长h的绝对值越小,图形越精确. 作函数y?f(x)在区间 [a,b]上的图形的MATLAB程序二 将y?f(x)化为h(x)?g(x),其中h(x)和g(x)是两个相等的简单函数
x=a:h:b; y1=h(x); y2=g(x); plot(x, y1, x, y2)
grid,gtext(' y1=h(x),y2=g(x)') 说明:此程序在MATLAB的工作区输入,运行后即可出现函数y1?h(x)和y2?g(x)的图形.两图形交点的横坐标即为所要求的根的近似值.
下面举例说明如何用计算机软件MATLAB的图形功能作图.
2.2.2 逐步搜索法及其MATLAB程序
逐步搜索法也称试算法.它是求方程f(x)?0根的近似值位置的一种常用的方法. 逐步搜索法依赖于寻找连续函数f(x)满足f(a)与f(b)异号的区间[a,b].一旦找到区间,无论区间多大,通过某种方法总会找到一个根.
MATLAB的库函数中没有逐步搜索法的程序,现提供根据逐步搜索法的计算步骤和它的收敛判定准则编写其主程序,命名为zhubuss.m. 逐步搜索法的MATLAB主程序 输入区间端点a和b的值,步长h和精度tol,运行后输出迭代次数 k=(b-a)/h+1,方程 f(x)?0根的近似值r. function [k,r]=zhubuss(a,b,h,tol) % 输入的量--- a和b是闭区间[a,b]的左、右端点; %---h是步长;
%---tol是预先给定的精度.
% 运行后输出的量---k是搜索点的个数;
% --- r是方程 在[a,b]上的实根的近似值,其精度是tol; X=a:h:b;Y=funs(X);n=(b-a)/h+1;m=0; X(n+1)=X(n);Y(n+1)=Y(n); for k=2:n
X(k)=a+k*h;Y(k)=funs(X(k)); %程序中调用的funs.m为函数
sk=Y(k)*Y(k-1); if sk<=0,
m=m+1;r(m)=X(k); end
xielv=(Y(k+1)-Y(k))*(Y(k)-Y(k-1)); if (abs(Y(k)) 例2.2.4 用逐步搜索法的MATLAB程序分别求方程2x3?2x2?3x?3?0和 sin(cos2x3)?0在区间[?2,2]上的根的近似值,要求精度是0.000 1. 解 在MATLAB工作窗口输入如下程序 >> [k,r]=zhubuss(-2,2,0.001,0.0001) 运行后输出的结果 k =4001 r = -1.2240 -1.0000 -1.0000 -0.9990 1.2250 即搜索点的个数为k =4 001,其中有5个是方程⑴的近似根,即r = -1.224 0,-1.000 0,-1.000 0,-0.999 0,1.225 0,其精度为0.000 1. 在程序中将y=2.*x.^3+2.*x.^2-3.*x-3用y=sin(cos(2.*x.^3)) 代替,可得到方程⑵在区间[?2,2]上的根的近似值如下 r = -1.9190 -1.7640 -1.5770 -1.3300 -0.9220 0.9230 1.3310 1.5780 1.7650 1.9200 如果读者分别将方程⑴的结果与例2.2.3比较,方程⑵的结果与例2.1.2比较,将会发现逐步搜索法的MATLAB程序的优点.如果精度要求比较高,用这种逐步搜索法是不合算的. 2.3 二分法及其MATLAB程序 2.3.1 二分法 二分法也称逐次分半法.它的基本思想是:先确定方程f(x)?0含根的区间(a,b),再把区间逐次二等分. 我们可以根据式(2.3b)、区间[a,b]和误差?,编写二分法求方程根的迭代次数的MATLAB命令. 已知闭区间[a,b]和误差?.用二分法求方程误差不大于?的根的迭代次数k的MATLAB命令 k=-1+ceil((log(b-a)- log(abtol))/ log(2)) % ceil是向+?方向取整,abtol是误差?. 2.3.2 二分法的MATLAB程序 二分法需自行编制程序,现提供用二分法求方程f(x)=0的根x的近似值xk的步骤和式(2.3a)编写一个名为erfen.m的二分法的MATLAB主程序如下. 二分法的MATLAB主程序 求解方程f(x)?0在开区间(a,b)内的一个根的前提条件是f(x)在闭区间[a,b]上连续,且f(a)?f(b)?0. 输入的量:a和b是闭区间[a,b]的左、右端点,abtol是预先给定的精度. 运行后输出的量:k是使用二分法的次数.x是方程 在(a,b)内的实根x*的近似值,其精度是abtol.wuca=|bk-ak|/2是使用k次二分法所得到的小区间的长度的一半,即实根x*的近似值x的绝对精度限,满足wuca≤ abtol.yx=f(xk) ,即方程f(x)=0在实根x*的近似值x *
第二章非线性方程(组)的数值解法的matlab程序



