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);
- 符号计算可以计算巨大的数。
计算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.
原因:不能找到解析解
- 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.