Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
科学计算软件 第六章 求解方程 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