matlab符号运算总结

contents:

1、生成符号函数的基本方法

2.把符号表达式转换成matlab句柄函数

3.符号表达式的化简和赋值

4.符号函数的赋值和作图

5.符号运算的微积分计算

6.代数方程和不等式的符号求解函数

7.微分方程的符号运算

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

符号运算函数

1、生成符号函数的基本方法

syms f(x, y)                      %生成符号变量x,y和符号函数f

F=sym(‘f(x, y)’)               %生成符号函数f

 

练习:

syms f(x,y)

Df=diff(f, y, 2)

G=taylor(f)

2.把符号表达式转换成matlab句柄函数

Fun=matlabFunction(f)

syms x y

f=x.^3+y.^3;

fun=matlabFunction(f);

x=-5:5; y=x;

[x,y]=meshgrid(x,y);

z=fun(x,y);

mesh(x,y,z)

3.符号表达式的化简和赋值

符号表达式的化简函数

           g=simplify(fun)

例:

>> y=expand((x-1)*(x+2)^4)

 y =

 x^5 + 7*x^4 + 16*x^3 + 8*x^2 - 16*x - 16

 

>> z=simplify(y)

 z =

 

(x - 1)*(x + 2)^4

>> yy=expand(sin(5*x))

 yy =

 

sin(x) - 12*cos(x)^2*sin(x) + 16*cos(x)^4*sin(x)

 >> simplify(yy)

 ans =

 

sin(5*x)

4.符号函数的赋值和作图

通用置换命令

RES=subs(ES, old, new)      %用new置换ES中的old后产生的符号结果

RES=subs(ES, new)            %用new置换ES中的自由变量后产生的符号结果

 

 

例:

syms a b x

f=a+b*sin(x);

t=0:pi/20:2*pi;

y=subs(f,{a,b,x},{2,3,t});

plot(t,y)

5.符号运算的微积分计算

df=diff(F, u, n)  %求表达式F的关于变量u的n阶导数

I=int(F,v);       %求函数表达式F关于变量v的不定积分

I=int(F, a, b);   %求函数表达式F在区间[a,b]上的定积分

I=int(F, v, a, b); %求函数表达式F在区间[a,b]上的关于变量v的定积分

 

S=symsum(g,a,b)  % 求通项g的下标在a和b之间的项的和

S=symsum(g,n,a,b)  % 求通项g的下标变量n在a和b之间的项的和

G=taylor(f, v, a, Name, Value)  %函数f在点a关于变量v的泰勒多项式

 常用属性包括

            ‘order’, 'ExpansionPoint'

6.代数方程和不等式的符号求解函数:solve

方程组求解

Y = solve(eqns,vars,Name,Value)

syms a u v

s= solve(a*u^2 + v^2 == 0, u - v == 1, a^2 + 6 == 5*a,  a, u, v)

[s1,s2,s3]=solve(a*u^2 + v^2 == 0, u - v == 1, a^2 + 6 == 5*a, a, u, v)

例:

解不等式

x>0

y>0

x2+6x-5<0

参考程序

clear

clc

syms x y

S = solve(x^2+6*x-5<0, x>0, y>0, x, y, 'ReturnConditions', true);

s1=S.x

s2=S.y

sc=S.conditions

7.微分方程的符号运算

常微分方程(组)的符号运算函数为dsolve,调用格式为

         变量=dsolve(eq1,eq2,…);

其中eq1, eq2等是字符串,描述微分方程。方程形式与solve语句中类似,其中的导数项利用D表示,Dy,D2y分别描述y的一阶和二阶导数。初值和边值条件也利用方程描述。

dsolve函数可以得到一般解和奇解

例:

clear all

y=dsolve('(Dy)^2-t*Dy+y=0','t')

clf

hy1=ezplot(y(1),[-6,6,-4,8],1)

hold on

set(hy1,'Color',[1 0 0],'LineWidth',3)

Sv=symvar(y(2));

for k=-2:0.2:2

    y2=subs(y(2),Sv(1),k);

    ezplot(y2,[-6,6,-4,8]);

end

hold off

box on

legend('奇解','通解','location','best')

xlabel('t')

ylabel('y')

title('(Dy)^2-t*Dy+y=0')

 

例:

%--------------------------------------

syms t x(t) x0  E

r=sym('log(5)');

x1(x0,t)=dsolve(diff(x)==-r*x,x(0)==x0);

x11=x1(x0,1);

x2(x0,t)=dsolve(diff(x)==-r*x,x(0)==x11);

x21=x2(x0,1);

x3_1(x0,E,t)=dsolve(diff(x)==-(r+42/100*E)*x,x(0)==x21);

x31_1=x3_1(x0,E,2/3);

x3_2(x0,E,t)=dsolve(diff(x)==-r*x,x(2/3)==x31_1);

x31_2=x3_2(x0,E,1);

x4_1(x0,E,t)=dsolve(diff(x)==-(r+E)*x,x(0)==x31_2);

x41=x4_1(x0,E,2/3);

x4_2(x0,E,t)=dsolve(diff(x)==-r*x,x(2/3)==x41);

  1. 符号计算可以计算巨大的数。

计算1000 !,并由此验证Stirling 公式;  

 

(1)s=prod(sym(1:1000)); 返回一个符号型 的巨大的数(2580位).

 

   

 

(2)s=factorial(1000); 返回 inf

 

 

>>factorial(1000)/factorial(999)

>> inf

符号计算失效的例子

 

1. dsolve( 'Dy==t+sin(y)', 'y(0)=1', 't')

 

 

 

 

Warning: Explicit solution could not be found.

 

原因:不能找到解析解

  1.  syms x;

     solve(x^5-x^3-2*x^2+3*x+10==0)

 

 

ans =

 

 root(z^5 - z^3 - 2*z^2 + 3*z + 10, z, 1)

 root(z^5 - z^3 - 2*z^2 + 3*z + 10, z, 2)

 root(z^5 - z^3 - 2*z^2 + 3*z + 10, z, 3)

 root(z^5 - z^3 - 2*z^2 + 3*z + 10, z, 4)

 root(z^5 - z^3 - 2*z^2 + 3*z + 10, z, 5)

 

原因:高次方程没有求根公式

3. Vanderpool 方程

非线性方程

sol=dsolve('D2y+(y^2-1)*Dy+y');

disp(sol);

 

Warning: Explicit solution could not be found.

> In dsolve (line 201)

4.有时符号计算可以用,但会大大的较低计算效率。比如

tic;

n=50;

A=diag((1:n).^2)+ones(n,n);

A=sym(A);

B=inv(A);

d=det(B);

disp(d);

toc;

 

 

1/24282925772316346494737097210034871284109462190334225449338

21986553009069859167784649122345878864339757170688000000000000000000000

 

Elapsed time is 4.211010 seconds.

 

 

    

若改为数值计算,则计算效率大大提高

tic;

n=50;

A=diag((1:n).^2)+ones(n,n);

%A=sym(A);

B=inv(A);

d=det(B);

disp(d);

toc;

 

d = 4.118119906045450e-130

 

Elapsed time is 1.264789 seconds.

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值