Matlab学习笔记——基础知识(3)
发布时间
阅读量:
阅读量
3.符号运算的基本内容
3.1符号变量代换及其函数
>> %符号变量代换及其函数
>> %subs(S, old, new) 把S中的old变量替换为new,old一定是符号表达式S中的符号变量,而new可以是符号变量,符号常量,数组,数值等
>> %subs(S, new) 用new替换为S中的自变量
>> syms a b c d k n x y w t;
>> f = a * x ^ n + b * y + k;
>> f1 = subs(f, [a b], [sin(t) log(w)])
f1 =
k + x^n*sin(t) + y*log(w)
>> f2 = subs(f,[a b k],[sin(t) log(w) c * exp(-d * t)])
f2 =
c*exp(-d*t) + x^n*sin(t) + y*log(w)
>> f3 = subs(f,[n k],[5 pi])
f3 =
a*x^5 + pi + b*y
>> f4 = subs(f1,k,1:4)
f4 =
[ x^n*sin(t) + y*log(w) + 1, x^n*sin(t) + y*log(w) + 2, x^n*sin(t) + y*log(w) + 3, x^n*sin(t) + y*log(w) + 4]
>> %在对符号表达式进行两个变量的数值数组替换,可以通过循环程序来实现
>> syms a k;
f = a * sin(x) + k;
for a = 1:2
for x = 0:pi/6:pi/3
f1 = a * sin(x) + k
end
end
f1 =
k
f1 =
k + 1/2
f1 =
k + 3^(1/2)/2
f1 =
k
f1 =
k + 1
f1 =
k + 3^(1/2)
3.2符号对象转换为数值对象的函数
>> %符号对象转化为数值对象的函数
>> %double() 可以把符号表达式的解析解转换为数值解,得到双精度数值解
>> %为获得指定精度的数值解,可以联合使用digits()和vpa()两个函数
>> c1 = str2sym('sqrt(2)*log(7)');
>> c2 = str2sym('pi*sin(pi/5)*exp(1.3)');
>> c3 = str2sym('exp(pi*sqrt(8))');
>> a1 = double(c1)
a1 =
2.7519
>> a2 = double(c2)
a2 =
6.7757
>> a3 = double(c3)
a3 =
7.2283e+03
>> class(a1)
ans =
'double'
>> class(a2)
ans =
'double'
>> class(a3)
ans =
'double'
%使用vpa 和 digits来进行数值转换后,所得仍是符号表达式
>> c4 = str2sym('exp(pi*sqrt(79))');
>> a4 = double(c4)
a4 =
1.3392e+12
>> class(a4)
ans =
'double'
>> a5 = vpa(a4,8)
a5 =
1.3391903e+12
>> class(a5)
ans =
'sym'
>> digits 18
>> a6 = vpa(a4)
a6 =
1339190288739.15527
>> class(a6)
ans =
'sym'
3.3符号表达式的化简
matlab提供了很多用于化简的函数,如因式分解,同类项合并,符号表达式的展开,符号表达式的化简和通分等。
>> %因式分解--factor()
>> syms x;
>> f = x^3+x^2-x-1;
>> f1 = factor(f)
f1 =
[ x - 1, x + 1, x + 1]
>> factor(5)
ans =
5
>> factor(84)
ans =
2 2 3 7
>> %符号表达式展开--expand()
>> syms x y;
>> f = (x+y)^3;
>> expand(f)
ans =
x^3 + 3*x^2*y + 3*x*y^2 + y^3
>> %合并同类项--collect()
>> syms a b c x;
>> f = -a*x*exp(-c*x)+b*exp(-c*x);
>> f1 = collect(f,exp(-c*x))
f1 =
(b - a*x)*exp(-c*x)
>> f2 = collect(f)
f2 =
(-a*exp(-c*x))*x + b*exp(-c*x)
>> f3 = 3*a+a^2+b*a+b^8*x;
>> collect(f3,a)
ans =
a^2 + (b + 3)*a + b^8*x
>> f4 = 5*a+7*a+5*b+7*b;
>> collect(f4)
ans =
12*b + 12*a
>> collect(f4,[a b])
ans =
12*a + 12*b
>> %符号表达式化简--simplify()和simple()
>> %simplify为运用多种恒等式进行综合化简
>> %simple为尝试多种不同的简化算法,以取得长度最短的简化形式
>> %[R,HOW] = simple(E) 为尝试多种不同的简化算法,返回参数R为表达式的简化形式,HOW为简化过程中采用的简化方法。
>> syms x n c alph beta;
>> e10 = sin(x)^2+cos(x)^2;
>> simplify(e10)
ans =
1
>> e20 = exp(c*log(alph + beta));
>> simplify(e20)
ans =
(alph + beta)^c
>> %符号表达式通分--numden()
>> %[N,D] = numden(E)N,D分别为通分后的分子和分母,返回N,D后再进行相除,即为所求,在无左边的返回值时,只返回分子
>> syms k p x y;
>> f = x/(k*y)+y/(p*x);
>> [N,D] = numden(f)
N =
p*x^2 + k*y^2
D =
k*p*x*y
>> f1 = N/D
f1 =
(p*x^2 + k*y^2)/(k*p*x*y)
>> numden(f)
ans =
p*x^2 + k*y^2
>> %对符号表达式进行嵌套型分解的函数--Horner
>> syms a b c d x;
>> f = -a*x^4+b*x^3-c*x^2+x+d;
>> f1 = horner(f)
f1 =
d - x*(x*(c - x*(b - a*x)) - 1)
3.4符号运算的其他函数
>> %符号运算的其他函数
>> %将数值对象、符号对象转换为字符对象的函数--char
>> syms a b c x y;
>> c = 123456;
>> class(c)
ans =
'double'
>> c1 = char(sym(c))
c1 =
'123456'
>> f = str2sym('x+y+z')
f =
x + y + z
>> f1 = char(f)
f1 =
'x + y + z'
>> class(f1)
ans =
'char'
>> %以习惯的方式显示符号表达式--pretty()
>> syms a b c d x y;
>> f = a*x/b+c/(d+y);
>> f1 = sqrt(b^2-4*a*c);
>> pretty(f)
c a x
----- + ---
d + y b
>> pretty(f1)
2
sqrt(b - 4 a c)
3.5两种特定的符号运算函数
>> %两种特定的符号运算函数
>> %复合函数的运算与函数命令compose()
>> %compose(f,g) compose(f,g,z)==compose(f,g,x,z)==compose(f,g,x,y,z) compose(f,g,t,z) compose(f,g,t,u,z)
>> syms f g t u x y z;
>> f = log(x/t);
>> g = u*cos(y);
>> cfg = compose(f,g)
cfg =
log((u*cos(y))/t)
>> cfgz = compose(f,g,z)
cfgz =
log((u*cos(z))/t)
>> cfgxz = compose(f,g,x,z)
cfgxz =
log((u*cos(z))/t)
>> cfgxyz = compose(f,g,x,y,z)
cfgxyz =
log((u*cos(z))/t)
>> cfgtz = compose(f,g,t,z)
cfgtz =
log(x/(u*cos(z)))
>> cfgtuz = compose(f,g,t,u,z)
cfgtuz =
log(x/(z*cos(y)))
>> %反函数的运算与函数命令finverse()
>> %finverse(f,v) finverse(f)
>> syms a b x y;
>> y = a*x+b;
>> g = finverse(y)
g =
-(b - x)/a
>> compose(y,g)
ans =
x
本章结束!
全部评论 (0)
还没有任何评论哟~
