> simple(ans)% one more time convert(exp) i*x) convert(tan) (1tan(1/2*x)^2/(1+tan(1/2*x)2)+2*itan(12*x)(1+tan(1/2*x)^2) ans = exp(i*x) 22.7可变精度算术运算 因为数值的精度受每次操作所保留的数位的限制,所以数值的任何运算都会引入舍入误 差,重复的多次数值运算会造成累积误差。而对符号表达式的运算是非常准确的,因为它们不 需要进行数值运算,所以无舍入误差。对符号运算结果用函数eva或 numeric,仅在结果转换 时会引入舍入误差。 MATLAB对数的处理完全依靠计算机的浮点算术运算,显然在内存中进行运算,又快又 好,只是浮点运算受到所支持字长的限制,每次操作会引入舍入误差,所以不能产生精确的结 果。 MATLAB中各个算术运算的相对精度大约是16位。相反, Maple的符号处理能力可以实现 任何数位的运算。当缺省的数位增加时,每次计算就需要附加时间和计算机内存 Maple缺省为16位的精度。函数 digits返回全局 Digits参数的当前值。Mapl缺省准确度可以 由 digits(a)来改变,其中n是所期望的准确度数位。用这种方法增加准确度的副作用是,每个 Maple函数随后进行的计算都以新的准确度为准,增加了计算时间。结果的显示不会改变,只 有所用的 Maple函数的缺省准确度受到影响 另外有一个函数,它可以任何精度实行单个计算,而使全局的 Digits参数不变。即:可变 精度的算术或函数vpa,它以缺省的精度或任何指定的精度对单个符号表达式进行计算,并以 同样的精度来显示结果。 > format long let's see all the usual digits >>pi how about T to numeric accuracy 3.14159265358979 >>digits display the default ' Digits'value Digits=16 > vpa('pi )% how about T to ' Digits'value 3.141592653589793
>> simple(ans) % one more time convert(exp): exp(i*x) convert(tan): (1-tan(1/2*x)^2)/(1+tan(1/2*x)^2)+2*i*tan(1/2*x)/(1+tan(1/2*x)^2) ans = exp(i*x) 22.7 可变精度算术运算 因为数值的精度受每次操作所保留的数位的限制,所以数值的任何运算都会引入舍入误 差,重复的多次数值运算会造成累积误差。而对符号表达式的运算是非常准确的,因为它们不 需要进行数值运算,所以无舍入误差。对符号运算结果用函数eval或numeric,仅在结果转换 时会引入舍入误差。 MATLAB对数的处理完全依靠计算机的浮点算术运算,显然在内存中进行运算,又快又 好,只是浮点运算受到所支持字长的限制,每次操作会引入舍入误差,所以不能产生精确的结 果。MATLAB中各个算术运算的相对精度大约是16位。相反,Maple的符号处理能力可以实现 任何数位的运算。当缺省的数位增加时,每次计算就需要附加时间和计算机内存。 Maple缺省为16位的精度。函数digits返回全局Digits参数的当前值。Maple缺省准确度可以 由digits(n)来改变,其中n是所期望的准确度数位。用这种方法增加准确度的副作用是,每个 Maple函数随后进行的计算都以新的准确度为准,增加了计算时间。结果的显示不会改变,只 有所用的Maple函数的缺省准确度受到影响。 另外有一个函数,它可以任何精度实行单个计算,而使全局的Digits参数不变。即:可变 精度的算术或函数vpa,它以缺省的精度或任何指定的精度对单个符号表达式进行计算,并以 同样的精度来显示结果。 >> format long % let ' s see all the usual digits >> pi % how about to numeric accuracy ans= 3.14159265358979 >> digits % display the default ' Digits ' value Digits=16 >> vpa(' pi ') % how about to ' Digits ' value ans= 3.141592653589793
>>digits( 18)% change the default to 18 digits > vpa(pi)% how about T to 'Digits'accuracy ans- 3.14159265358979324 >> vpa( pi, 20)% how about T to 20 digits ans- 3.1415926535897932385 > vpad'pi, 50)%how about T to 50 digits 3.1415926535897932384626433832795028841971693993751 > vpa(2(1/3), 200)% the cube root of 2 to 200 digits 1.2599210498948731647672106072782283505702514647015079800819751121552996765 1395948372939656243625509415431025603561566525939900240406137372284591103042 693552469606426166250009774745265654803068671854055 将函数vpa作用于符号矩阵,对它的每一个元素进行计算也同样达到所指定的位数。 >>A=sm([/4,log(sqrt(2):exp(1),3/7]") [ 1/4, log(sqrt(2)) lexp(1) 3/7) > vpa(A, 20)% evaluate to 20 digits [.2500000000000034657359027997265471 2.7182818284590452354,42857142857142857143 22.8方程求解 用 MATLAB所具有的符号工具可以求解符号方程。有一些工具已经在前面介绍过,更多 将在本节予以检验 求解单个代数方程
>> digits(18) % change the default to 18 digits >> vpa(' pi ') % how about to ' Digits ' accuracy ans= 3.14159265358979324 >> vpa( ' pi ' ,20) % how about to 20 digits ans= 3.1415926535897932385 >> vpa( ' pi ' ,50) % how about to 50 digits ans= 3.1415926535897932384626433832795028841971693993751 >> vpa( ' 2^(1/3) ' ,200) % the cube root of 2 to 200 digits ans= 1.2599210498948731647672106072782283505702514647015079800819751121552996765 1395948372939656243625509415431025603561566525939900240406137372284591103042 693552469606426166250009774745265654803068671854055 将函数vpa作用于符号矩阵,对它的每一个元素进行计算也同样达到所指定的位数。 >> A=sym( ' [1/4,log(sqrt(2));exp(1),3/7] ' ) A= [ 1/4 , log(sqrt(2))] [exp(1) , 3/7)] >> vpa(A,20) % evaluate to 20 digits ans= [ .2500000000000000000, .34657359027997265471] [2.7182818284590452354, .42857142857142857143] 22.8 方程求解 用MATLAB所具有的符号工具可以求解符号方程。有一些工具已经在前面介绍过,更多 将在本节予以检验。 求解单个代数方程
我们在前面已经看到, MATLAB具有求解符号表达式的工具。如果表达式不是一个方程 式(不含等号),则在求解之前函数sole将表达式置成等于0a >>solve(a*x2+b *x+c)% solve for the roots of the quadratic eqution [/2/a°(-b+(b^2-4*ac)^l/2) [/2/a*(-b-(b^24°atc)1/2) 结果是符号向量,其元素是方程的2个解。如果想对非缺省ⅹ变量求解,sole必须指定变 量 >>solve('a*x2+b*x+c,'b')% solve for b 带有等号的符号方程也可以求解。 >>fsolve( ' cos(x=sin(x ))% solve for x >>t=solve( tan(2*x)=sin(x)') acos(1/2+1/2*3^(1/2) acos(1/2=1/2*3/2 并得到数值解。 >> numeric(f) ans- 0.7854 ic(t) 0+0.8314i 1.9455 注意在求解周期函数方程时,有无穷多的解。在这种情况下, solve对解的搜索范围限制在 接近于零的有限范围,并返回非唯一的解的子集
我们在前面已经看到,MATLAB具有求解符号表达式的工具。如果表达式不是一个方程 式(不含等号),则在求解之前函数solve将表达式置成等于0。 >> solve( ' a*x^2+b*x+c ' ) % solve for the roots of the quadratic eqution ans= [1/2/a*(-b+(b^2-4*a*c)^1/2)] [1/2/a*(-b-(b^2-4*a*c)^1/2)] 结果是符号向量,其元素是方程的2个解。如果想对非缺省x变量求解,solve必须指定变 量。 >> solve( ' a*x^2+b*x+c ' , ' b ' ) % solve for b ans= -(a*x^2+c)/x 带有等号的符号方程也可以求解。 >> f=solve( ' cos(x)=sin(x) ' ) % solve for x f= 1/4*pi >> t=solve( ' tan(2*x)=sin(x) ' ) t= [ 0] [acos(1/2+1/2*3^(1/2))] [acos(1/2=1/2*3^(1/2))] 并得到数值解。 >> numeric(f) ans= 0.7854 >> numeric(t) ans= 0 0 + 0.8314i 1.9455 注意在求解周期函数方程时,有无穷多的解。在这种情况下,solve对解的搜索范围限制在 接近于零的有限范围,并返回非唯一的解的子集
如果不能求得符号解,就计算可变精度解 >>x=solve( exp(x=tan (x)) 1.306326940423079 代数方程组求解 可以同时求解若干代数方程,语句sole(sl,s2,…,sn)对缺省变量求解n个方程,语句 solve(sl,s2,…,sn,'vl,v2,…,vn)对n个vl,v2,…n的未知数求解n个方程 如何处理中小学典型的代数问题? 黛安娜( Diane)想去看电影,她从小猪夺钱罐倒出硬币并清点,她发现: 10美分的硬币数加上5美分的硬币总数的一半等于25美分的硬币数。 1美分的硬币数比5美分、10美分以及25美分的硬币总数多10 25美分和10美分的硬币总数等于1美分的硬币数加上14的5美分的硬币数 25美分的硬币数和1美分的硬币数比5美分的硬币数加上8倍的10美分的硬币数多1。 如果电影票价为3.00美元,爆米花为1.00美元,糖棒为50美分,她有足够的钱去买这三样 东西? 首先,根据以上给出的信息列出一组线性方程,假如p,n,d和q分别表示1美分,5美分 10美分,和25美分的硬币数 d n+p q p=n+d+q-10 q+d=p q+p=n+8d-1 然后,建立 MATLAB符号方程并对变量求解 d d+q-10 d=p+n/4 >>pennies, nickles, dimes, quarters]=solve(equl, equ2, equ3, equ, 'p, n, d, q ') 16
如果不能求得符号解,就计算可变精度解。 >> x=solve( ' exp(x)=tan(x) ' ) x= 1.306326940423079 代数方程组求解 可以同时求解若干代数方程,语句solve(s1,s2,.....,sn)对缺省变量求解n个方程,语句 solve(s1,s2,...,sn,' v1,v2,...,vn ')对n个' v1,v2,...vn '的未知数求解n个方程。 如何处理中小学典型的代数问题? 黛安娜(Diane)想去看电影,她从小猪存钱罐倒出硬币并清点,她发现: • 10美分的硬币数加上5美分的硬币总数的一半等于25美分的硬币数。 • 1美分的硬币数比5美分、10美分以及25美分的硬币总数多10。 • 25美分和10美分的硬币总数等于1美分的硬币数加上1/4的5美分的硬币数 • 25美分的硬币数和1美分的硬币数比5美分的硬币数加上8倍的10美分的硬币数多1。 如果电影票价为3.00美元,爆米花为1.00美元,糖棒为50美分,她有足够的钱去买这三样 东西? 首先,根据以上给出的信息列出一组线性方程,假如p,n,d和q分别表示1美分,5美分, 10美分,和25美分的硬币数 d n p q p n d q q d p n q p n d + + = = + + − + = + + = + − 2 10 4 8 1 然后,建立MATLAB符号方程并对变量求解。 >> eq1= ' d+(n+p)/2=q ' ; >> eq2= ' p=n+d+q-10 ' ; >> eq3= ' q+d=p+n/4 ' ; >> eq4= ' q+p=n+8*d-1 ' ; >>[pennies,nickles,dimes,quarters]=solve(equ1,equ2,equ3,equ4,' p,n,d,q ' ) pennies= 16 nickles=
Imes- 15 所以,黛安娜有16枚1美分的硬币,8枚5美分的硬币,3枚10美分的硬币,15枚25美分的硬 币,这就意味着 >> money=01*16+.05*8+.10*3+.25*15 money 4.610 她就有足够的钱去买电影票,爆米花和糖棒并剩余11美分。 单个微分方程 常微分方程有时很难求解, MATLAB提供了功能强大的工具,可以帮助求解微分方程。 函数 dsovle计算常微分方程的符号解。因为我们要求解微分方程,就需要用一种方法将微分包 含在表达式中。所以, dsovle句法与大多数其它函数有一些不同,用字母D来表示求微分, D2,D3等等表示重复求微分,并以此来设定方程。任何D后所跟的字母为因变量。方程 dFy/dx2=0用符号表达式D2y=0来表示。独立变量可以指定或由 sylvan规则选定为缺省。例 ,一阶方程dyh=+y2的通解为 >>dsolve( 'Dy=l+y2)% find the general solution tan(-x+Cl) 其中,C1是积分常数。求解初值y0)=1的同一个方程就可产生: > dsolve(Dy=l+y 2, y(o=l)% add an initial condition tan(x+ 1/4 pi) 独立变量可用如下形式指定 >> dsolve( Dy=l+y2, y(o=l',v)% find solution to dy/dy ans- tan(v+1/4°pi) 让我们举一个二阶微分方程的例子,该方程有两个初始条件:
8 dimes= 3 quarters= 15 所以,黛安娜有16枚1美分的硬币,8枚5美分的硬币,3枚10美分的硬币,15枚25美分的硬 币,这就意味着 >> money=.01*16+.05*8+.10*3+.25*15 money= 4.6100 她就有足够的钱去买电影票,爆米花和糖棒并剩余11美分。 单个微分方程 常微分方程有时很难求解,MATLAB提供了功能强大的工具,可以帮助求解微分方程。 函数dsovle计算常微分方程的符号解。因为我们要求解微分方程,就需要用一种方法将微分包 含在表达式中。所以,dsovle句法与大多数其它函数有一些不同,用字母D来表示求微分, D2,D3等等表示重复求微分,并以此来设定方程。任何D后所跟的字母为因变量。方程 d y dx 2 2 / =0用符号表达式D2y=0来表示。独立变量可以指定或由symvar规则选定为缺省。例 如,一阶方程dy/dx=1+y2的通解为: >> dsolve( ' Dy=1+y^2 ' ) % find the general solution ans= -tan(-x+C1) 其中,C1是积分常数。求解初值y(0)=1的同一个方程就可产生: >> dsolve(' Dy=1+y^2 ',' y(0)=1 ') % add an initial condition y= tan(x+1/4*pi) 独立变量可用如下形式指定: >> dsolve(' Dy=1+y^2 ',' y(0)=1 ',' v ') % find solution to dy/dv ans= tan(v+1/4*pi) 让我们举一个二阶微分方程的例子,该方程有两个初始条件: