超越方程 - 数学科学学院

Download Report

Transcript 超越方程 - 数学科学学院

科学计算软件
第六章
求解方程
1
6.1 求解代数方程

Solve[方程,变量]:尝试求解关于变量的方程。
 注意方程中的等号要用连等号“==”表示
 方程的根用列表形式表示:{{x->x1},{x->x2},...},
注意符号x并没有用x1取代
例1 当只有一个符号时,在Solve命令中不必列出
Solve[7x+3==3x+8]

2
6.1 求解代数方程
例2 出现多个符号时,要标明哪些符号是待求变量
Solve[a y+b==c x+d]
Solve[a y+b==c x+d,y]
Solve[a y+b==c x+d,b]
Solve[a y+b==c x+d,d]

3
6.1 求解代数方程
方程组的求法
 例3
Solve[{2x+3y==7,3x+4y==10},{x,y}]
Solve[{2x+3y==7&&3x+4y==10}]
Solve[2x+3y==7&&3x+4y==10]

4
6.1 求解代数方程
例4 如果未知数的个数超过方程的个数,则必须指
定所希望求解的变量
Solve[{x+2y+z==5,2x+y+3z==7},{y,z}]

例5 Solve同样可以求解非线性方程,下式将得到一
元二次方程的求根公式
Solve[a x^2+b x+c==0,x]

5
6.1 求解代数方程

Solve得到的解以嵌套列表的形式表示,所以不能
直接作为其它数学结构的输入。
 先将解用一个变量表示,再用替换符号代入
 使用Part或[[]]提取列表中的值
 例7 求给定的方程组的解,并求Sqrt[x^2+y^2]在
这些解上的值
solutions=Solve[{x^2+y==5,x+y==3},{x,y}]
Sqrt[x^2+y^2]/.solutions
6
6.1 求解代数方程
代数方程是未知数和常数进行有限次代数运算所组
成的方程。代数方程包括有理方程和无理方程。
 与代数方程相对的是超越方程。
 代数运算是指包括加、减、乘、除、乘方、开方的
以代数式为对象的运算。
 代数式就是用字母表示常数或变量的表达式,其中
也可包含数字。代数式包括整式和分式。

7
6.1 求解代数方程





超越方程:等号两边至少有一个含有未知数的初等
超越函数式的方程。
如指数方程、对数方程、三角方程、反三角方程等。
例如:2^x=x+1,sin x+x=0。
超越方程一般没有解析解,而只有数值解或近似解,
只有特殊的超越方程才可以求出解析解来。
求解超越方程的近似解法有很多。常用的近似解法
有牛顿法、割线法、幂级数解法等等
8

超越函数
 自变量之间的关系不能用有限次加、减、乘、
除、乘方、开方 运算表示的函数。
 如指数函数、对数函数、三角函数和反三角函
数等都是超越函数
9
6.1 求解代数方程
例9 Solve也可以求解超越方程的有限解。这时会得
到一条消息,告知它并没有求出所有解
Solve[Sin[x]==1/2,x]

例10
Solve[{2x+3y==5,4x+6y==11}]

10
6.1 求解代数方程
例11 Mathematica中用-1的幂来表示复数,也可以
指定用i表示虚数单位
Solve[x^3==1]
Solve[x^3==1]/.(a_->b_):>(a->ComplexExpand[b])
 载入软件包Miscellaneous`RealOnly`可以给所有的
复根标上Nonreal,即只显示实根的值
<<Miscellaneous`RealOnly`
Solve[x^3==1]

11
6.1 求解代数方程
并不是所有的代数方程都有符号解,这时要考虑有
限精度的数值解
 NSolve[方程,变量]:求解方程关于变量的数值解
 NSolve[方程,变量,n]:求解方程关于变量的数值解,
达到n位精度

12
6.1 求解代数方程
例 12
equation=x^4-16x^3+61x^2-22x-12==0;
Solve[equation]
NSolve[equation]
NSolve[equation,25]

13
6.1 求解代数方程
对于NSolve来说,过高的精度有时没有意义,因为
Mathematica在内部计算时默认只使用16位有效数
字。
 此时可以使用N[Solve[方程,变量],n]来指定精度
 例13
NSolve[x^(1/3)+Sqrt[x]+x==10,x,20]
N[Solve[x^(1/3)+Sqrt[x]+x==10,x],20]

14
6.1 求解代数方程

Reduce[方程,变量]:简化方程,并尝试求解变量。
 如果方程为恒等式,就返回值True
 如果方程为矛盾的,则返回False
 例 15
Solve[a x==b,x]
Reduce[a x==b,x]
Reduce[ x^2-9==(x+3) (x-3),x]
Reduce[ x^2-10==(x+3) (x-3),x]
15
6.2 求解超越方程

FindRoot[lhs==rhs,{x,x0}]:利用初始值为x0的牛
顿法求解方程
 FindRoot[lhs==rhs,{x,x0,x1}]:利用初始值为x0和
x1的割线法求解方程
 FindRoot[lhs==rhs,{x,x0,xmin,xmax}]:尽力求解
方程,当迭代超出区间[xmin,xmax]就停止
 FindRoot的第一个参数“lhs==rhs”表示方程(含有
未知量的等式),也可以是一个函数,此时表示求
函数的零点。
16
6.2 求解超越方程
例 16 求解方程Sin x=x^2-1
Plot[{Sin[x],x^2-1},{x,-Pi,Pi}]

FindRoot[Sin[x]==x^2-1,{x,-1}]
FindRoot[Sin[x]==x^2-1,{x,1}]
17
6.2 求解超越方程
牛顿法并不是全局收敛的,所以初始值的选取非常
重要,要求初始值尽可能接近解。
 注意这并不是牛顿法收敛的充分条件!
 例17 x+Sin x=0
FindRoot[x+Sin[x]==0,{x,100}]


默认情况下FindRoot最大迭代次数为15,超过这一
次数数值解仍没有达到收敛则会终止求解
18
6.2 求解超越方程

MaxIterations->n:指定系统在终止求解之前最多
进行n次迭代
 例18
FindRoot[x+Sin[x]==0,{x,100}, MaxIterations->25]
例19
FindRoot[x^2+x+1==0,{x,1}]
FindRoot[x^2+x+1==0,{x,I}]

19
6.2 求解超越方程
牛顿法的收敛条件较为复杂,并且有时不易事先验
证。此时可以使用割线法,虽然收敛的速度较慢,
但是收敛条件简单易判。
 例20 求解Sqrt[Abs[x]]+x-1==0
 牛顿法的计算要用到函数的导数,本例中方程左端
表达式的导数用Mathematica无法求出
f[x_]= Sqrt[Abs[x]]+x-1;
f'

20
6.2 求解超越方程
例20 求解Sqrt[Abs[x]]+x-1==0
FindRoot[Sqrt[Abs[x]]+x-1,{x,1}]

下面用割线法求解,这需要在FindRoot中指定两个
初始值。本例中方程在0与1之间有一个根(为什
么?)
FindRoot[Sqrt[Abs[x]]+x-1,{x,0,1}]
FindRoot[Sqrt[Abs[x]]+x-1,{x,{0,1}}]

21
6.2 求解超越方程
牛顿法的计算要用到函数的导数,在有些情况下可
以使用Jacobian选项指定要使用的导数
 对于一元函数而言,其雅可比矩阵即为其导数
 例21 上例中Sqrt[Abs[x]]的导数为Sing[x]/(2 Sqrt[x])
FindRoot[Sqrt[Abs[x]]+x-1,{x,1},Jacobian->Sing[x]/(2
Sqrt[Abs[x]])+1]

22
6.2 求解超越方程
数值计算相对于符号运算的重要特点是只具有有限
精度。在FindRoot和其它数值算法中有两个参数用
来控制运算的精度
 WorkingPrecision->n:指定在内部计算时保持多
少位精度,默认为16位
 AccuracyGoal->e:指定收敛误差。当|lhs-rhs|<
AccuracyGoal时,迭代终止

23
6.2 求解超越方程
例22 求出方程Cos[100/x]=x/(x+1)最靠近5000的近
似解,准确到第10位小数
FindRoot[Cos[100/x]==x/(x+1),{x,5000}]
FindRoot[Cos[100/x]==x/(x+1),{x,5000},WorkingPreci
sion->24]

注意实际的有效数字的位数
FindRoot[Cos[100/x]==x/(x+1),{x,5000},WorkingPreci
sion->24,AccuracyGoal->23]

24
6.2 求解超越方程
为了观察实际的迭代过程,对代码作改动,以观察
中间结果
 例23 使用Print函数察看求解方程Exp[-x]==x求解
的中间过程,以研究该过程的收敛速度
n=-1;
FindRoot[If[n>=0,Print[n,' ',x]];n++;Exp[-x==x,{x,2}]]

25
6.2 求解超越方程
例24 比较牛顿法与割线法的收敛速度
 设置较大的计算精度,使用Timing确定程序花费的
时间
 牛顿法
n=0;
FindRoot[n++;Exp[-x]==x,{x,1}, WorkingPrecision>100]

26
6.2 求解超越方程
例24 下面比较牛顿法与割线法的收敛速度
 割线法
n=0;
FindRoot[n++;Exp[-x]==x,{x,1,2}, WorkingPrecision>100]//Timing

27
6.2 求解超越方程
牛顿法对于重根有时会失效,此时可以尝试使用
DampingFactor选项改善结果
 damping:阻尼, 减幅, 衰减
 例25
FindRoot[(Exp[x]-1)^2,{x,2}]
FindRoot[(Exp[x]-1)^2,{x,2},DampingFactor->2]

28
6.2 求解超越方程

FindRoot也可以求解方程组的解
 FindRoot[方程组,{变量1,a1},{变量2,a2},...]:当变
量1,变量2...的初始值为a1,a2...时尝试求解方程组
 例26 求解方程组Exp[x]+Log[y]=2,Sin[x]+Sin[y]=1
<<Graphics`ImplicitPlot`
ImplicitPlot[{Exp[x]+Log[y]==2, Sin[x]+Sin[y]==1},
{x,0,2},PlotRange->{0,3}]
FindRoot[{Exp[x]+Log[y]==2, Sin[x]+Sin[y]==1},
{x,1},{y,1}]
29
6.2 求解超越方程

InterpolationRoot[lhs==rhs,{x,a,b}]:利用初值a、
b求解方程
 与FindRoot在局部使用线性函数近似方程的根不同,
InterpolationRoot使用二次或三次多项式近似方程
的根,所以在理想情况下只需要更少的计算次数就
可以得到更高精度的解
 InterpolationRoot包含在软件包
NumericalMath`InterpolationRoot`中
30
6.2 求解超越方程
例27使用工作精度为1000位有效数字计算贝塞尔函
数的介于2与3之间的零点
FindRoot[BesselJ[0,x],{x,2},WorkingPrecision>1000];//Timing

<<NUmericalMath`interpolateRoot`
InterpolateRoot[BesselJ[0,x],{x,2,3},WorkingPrecisio
n->1000];//Timing
31