Matlab 专题七

一、符号对象

1、符号对象的建立

 符号对象包括:符号常量、符号变量。

(1)sym函数

用于建立单个的符号对象,调用格式为:       

符号对象名 = sym(A)。其中,A可以是一个数值常量、数值矩阵或数值表达式不加单引号),此时符号对象为一个符号常量;A也可以是一个变量名加单引号),这是符号对象为一个符号变量

%符号对象的建立
%符号常量
t = sym(2); %将数值二转化为符号对象,并赋值给t
t1 = t + 1/2;   %符号对象 加 1/2
disp('(2 + 1/2)符号常量为 ');
disp(t1);

t2 = sin(sym(pi/3)); %将数值pi/3,转化为符号对象,求其正弦值。
disp('sin(符号常量pi/3) = ');
disp(t2);

disp('sin(数值常量pi/3) = ');
disp(sin(pi/3));



%符号对象的建立
%符号变量
a=5;
b=-8;
x=sym('a');
y=sym('b');
s = (x+y)*(x-y);
w = (a+b)*(a-b);

disp('符号变量x、y运算结果:')
disp(s);
disp('数值变量a、b运算结果:')
disp(w);


%eval()可以将符号表达式转化为数值结果
s1 = eval(s);
disp('符号表达式转化为数值结果:');
disp(s1);


%由运算结果可以,符号变量的运算的结果为:数值变量的表达式
%而数值变量的运算结果为:数值运算结果数值。

由以上程序可知,

  • 》》》符号计算的结果是一个精确数学表达式
  • 》》》数值计算的结果是一个数值。

(2)syms命令

syms命令可以一次定义多个符号变量,其一般调用格式如下:

        syms 符号变量名1 符号变量名2 ··· 符号变量名n

其中,变量名不能加单引号,相互之间用空格隔开。

 例如:syms a b c d;


% syms命令
syms a b c d; 
% 多个符号变量的定义,将多个符号变量用运算符连接起来就组成了符号表达式

2、符号对象的运算

 (1)四则运算

 符号表达式的四则运算与数值运算一样,用 + - * / ^ 运算符实现,其运算结果依然是一个符号表达式。

(2)关系运算

6种关系运算符:<    <=    >    >=    ==    ~=。

对应的6个函数:lt()、le()、gt()、ge()、eq()、ne()。

若参与运算的是符号表达式,其结果是一个符号关系表达式;若参与运算的是符号矩阵,其结果是由符号关系表达式组成的矩阵

在进行符号对象的运算前,可用assume函数对符号对象设置值域,函数调用格式为:

        assume(condition):        指定变量满足条件condition

        assume(expr,set):          指定表达式expr属于集合set

(3)逻辑运算

3种逻辑运算符:&、I、~。

4个逻辑运算函数:and()、or()、not() 和 xor()。

(4)因式分解与展开运算

MATLAB提供了对符号表达式进行因式分解、展开、合并的函数,函数调用格式为:

factor(s):对符号表达式s分解因式。

expand(s):对符号表达式s进行展开。

collect(s):对符号表达式s合并同类项。

collect(s,v):对符号表达式s按变量v合并同类项。

%例子 四则运算
syms x;
f = 2*x^2+3*x-5;
g = x^2-x+7;
s = f+g;    %结果为一个符号表达式
disp('s = ');
disp(s);


%例子 关系运算
syms x;
assume(x<0);    %设置符号变量的范围 <0 。
x1 = abs(x)==x;
disp('符号对象关系运算后x1 = ');
disp(x1);

sym x;
assume(x,'positive');
x2 = abs(x)==x;
disp('符号对象关系运算后x2 = ');
disp(x2);

clear
clc
%例子 逻辑运算
syms x;
y1=x>0 & x<10;
disp('符号对象逻辑运算后y1 = ');
disp(y1);

%也可以用and(),实现以上功能
y2=and(x>0,x<10);
disp('符号对象逻辑运算后y2 = ');
disp(y2);

%例子 因式分解与展开运算
syms a b;
s=a^3-b^3;
s1 = factor(s); %强大的因式分解能力
disp('因式分解后结果:');
disp(s1);

x24 = factor(24); %具有将正整数分解为质因子的能力
disp('24分解为质因子为:');
disp(x24);

梅森素数的验证问题

所谓梅森数,是指形如2^p - 1的一类整数,其中指数p是素数。将梅森数记为Mp。如果梅森数是素数,就称为梅森素数。请验证M19、M23、M29、M31是否为梅森素数。


%梅森素数的验证问题
%验证m19是否是素数
syms p;
m = 2^p-1;
p =19;
m19 = eval(m);  %将符号变量转为数值
disp('m19 = ');
disp(m19);

m_19 = factor(m19);%验证m19是否为素数

if m_19 == m19
    disp('m19为素数')
else
    disp('m19不为素数')
end

%验证m23是否是素数

p =23;
m23 = eval(m);
disp('m23 = ');
disp(m23);

m_23 = factor(m23);

if m_23 == m23
    disp('m23是素数')
else
    disp('m23不是素数')
end

%验证m29是否是素数

p = 29;
m29 = eval(m);
disp('m29 =');
disp(m29);

m_29 = factor(m29);

if m_29 == m29
    disp('m29 Yes!!!')
else
    disp('m29 No!!!')
end

%验证m31是否为素数

p =31;
m31 = eval(m);
disp('m31 = ');
disp(m31);

m_31 = factor(m31);

if m_31 == m31
    disp('m31 Yes!!!')
else
    disp('m31 No!!!')
end


(5)其他运算

①提取有理分式的分子分母:[n,d] = numden(s)

②提取符号表达式的系数:C= coeffs(s,x)

③符号表达式化简: simplify(s)。

④符号多项式与多项式系数向量之间的转换:

        符号多项式转换为多项式系数向量:p=sym2poly(s)

        多项式系数向量转换为符号多项式:s=poly2sym(p)

(6)符号运算中变量的确定

①如果没有明确指定自变量,MATLAB将按以下原则确定主变量并对其进行相应运算:

        寻找除i、j之外,在字母顺序上最接近x的小写字母。

        若表达式中有两个符号变量与x的距离相等,则ASCII码大者优先。

②symvar()函数可以用于查找一个符号表达式中的符号变量,函数的调用格式为:

        symvar(s,n)

        函数返回符号表达式s中的n个符号变量。因此,可以用symvarl(s,1)查找表达式s的主变量。

3、符号矩阵

符号矩阵也是一种符号表达式,所以符号表达式运算都可以在矩阵意义下进行。

注意:这些函数作用于符号矩阵时,是分别作用于矩阵的每一个元素。

%符号矩阵
syms a b x y alp
m =[a^3-b^3,sin(alp)^2+cos(alp)^2;...
    (15*x*y - 3*x*x)/(x-5*y),78];
m1 = simplify(m)

符号矩阵也是 矩阵,所以矩阵的运算,符号矩阵都适用。 

diag()        inv()        det()        rank()        trace()        都适用于符号矩阵

%符号矩阵
syms a b x y alp
m =[a^3-b^3,sin(alp)^2+cos(alp)^2;...
    (15*x*y - 3*x*x)/(x-5*y),78];
m1 = simplify(m);
disp('化简后结果为:');
disp(m1);
disp('对角线元素为:');
disp(diag(m1));
disp('逆矩阵为:');
disp(inv(m1));
disp('秩为:');
disp(rank(m1));
disp('迹为:');
disp(trace(m1));

 

% 自己写的
syms lamda
A = [1-lamda,-2,4;...
    2,3-lamda,1;...
    1,1,1-lamda];
A_ = det(A);    %显然lamda等于0,是符合要求的lamda
A_x = coeffs(A_);
A_x = A_x(end:-1:1);
la = roots(A_x);
disp('lamda = ');
disp([0;la]);

%其他解法
syms lamda;
A = [1-lamda,-2,4;...
    2,3-lamda,1;...
    1,1,1-lamda];
D = det(A);
factor(D)   %因式分解的结果

 Matlab不仅可以进行数值运算,而且可以进行符号运算,数值计算有舍入误差,像是一种近似计算,符号计算,更像一种证明推演,结果也更加精确。

二、符号微积分

1、符号函数的极限

 (1)符号函数的极限

》》》求符号函数极限的命令为limit,其调用格式为:

        limit(f,x,a )       

即求函数f关于变量x在a点的极限。若x省略,则采用系统默认的自变量。a的默认值为0。

 》》》limit函数的另一种功能是求单边极限,其调用格式为:

        limit(f,x,a,'right')

        limit(f,x,a'left')

%求极限
syms x m a;
f = (x^(1/m)-a^(1/m))/(x-a);
x1 = limit(f,x,a);
disp('极限值如下:');
disp(x1);

syms n;
g = (1+1/n)^n;
x2 =limit(g,n,inf)
disp('极限如下:');
disp(x2);

2、符号函数的导数

 MATLAB 中的求导函数为:

        diff(f,x,n)

即求函数f关于变量x的n阶导数。参数x的用法同求极限函数limit,可以缺省,默认值与limit相同,n的默认值。在函数变量多于一个的情况下,diff函数也可以用来求偏导数。

clear
clc
%求导数
syms x;
y = (1+exp(x))^(1/2);
y_ = diff(y,x,1);
disp('y'' = ');
disp(y_);

%求偏导数
syms x y;
z = x*exp(y)/(y*y);
zx = diff(z,x,1);
zy = diff(z,y,1);
disp('zx'' = ');
disp(zx);
disp('zy'' = ');
disp(zy);

极限、导数、微分的概念是紧密关联的。有极限是可导的前提,而导数是微分之商,因此导数也称为微商。

3、符号函数的积分

 (1)不定积分

在MATLAB中,求不定积分的函数时int,其常用的调用格式为:

                        int(f,x)

求函数f对变量x的不定积分。

clear
clc
%求不定积分
syms x t;
f = (3-x^2)^3;
y1 = int(f,x)

f = (5*x*t)/(1+x^2);
y2 = int(f,t)


%题目在代码中

(2)定积分

在MATLAB中,定积分的计算也使用int命令,但调用格式有区别:

                        int(f,x,a,b)

其中,a、b分别表示定积分的下限和上限。

  • 当函数f关于变量 x 在闭区间 [a,b] 可积时,函数返回一个定积分结果。
  • 当a、b中有一个是 inf 时,函数返回一个广义积分。
  • 当a、b中有一个符号表达式时,函数返回一个符号函数。

clear
clc
%求定积分
syms x t;
f = abs(1-x);
y1 = int(f,x,1,2)

f = 1/(1+x^2);
y2 = int(f,x,-inf,inf)

f = 4*x/t;
y3 = int(f,t,2,sin(x))

无题——思路拟合曲线,求面积(定积分)

%先拟合曲线,然后进行定积分。
xi=0:50:600;
yi=[4.4,4.5,4.6,4.8,4.9,5.1,5.4,5.2,5.5,5.2,4.9,4.8,4.7];
p = polyfit(xi,yi,3);       % 根据样本数据xi、yi,拟合出三次曲线,返回三次多项式的系数
plot(xi,yi,'o',xi,polyval(p,xi));   % polyval计算系数为 p 的多项式在 xi 点取值

syms y x;
y = poly2sym(p,x);  %将数值多项式,转为符号多项式。
s = int(y,x,0,600); %计算横截面积
v = s*0.6;
eval(v)

三、级数

利用收敛的无穷级数进行逼近函数。。。利用符号计算来进行级数的计算。

1、级数求和

 sum()函数也能进行级数求和。但是项数必须有限,而且要表示成向量形式。

 求无穷级数的和需要符号表达式求和函数symsum(),其调用格式为:

                        symsum(s,v,n,m)

其中,s表示一个级数的通项,是一个符号表达式。v是求和变量,v省略时使用系统默认变量。n和m是求和变量v的初值和末值。

clear
clc
%{
实例:求级数之和
符号计算可以得到一个表达式(如:pi/2、log(2))
数值计算会给出一个有舍入的近似值。

所以符号计算的意义就在于:符号计算结果更加精确。

这个例子就可以很好的证明这一点。
%}
syms n
sn1 = n^2;
s1 = symsum(sn1,n,1,1000)

sn2 = ((-1)^(n+1))*(1/n);
s2 = symsum(sn2,n,1,inf)

sn3 = ((-1)^(n+1))*(1/(2*n+1));
s3 = symsum(sn3,n,1,inf)


>>s1 =
 
333833500
 
 
s2 =
 
log(2)
 
 
s3 =
 
1 - pi/4

在级数的计算中,因为小数表示有理分数的形式,容易导致分子或分母出现极大整数无法计算的情况。 

2、泰勒级数

作用:将任意一个函数表示为一个幂级数。

MATLAB中将函数展开为幂级数的函数为:tayor(),调用格式如下:

                taylor(f,v,a,Name,value)

该函数将函数f按变量 v 在 a 点展开为泰勒级数,v省略时按默认规则确定变量,a 的默认值为0。Name和Value为选项设置,经常成对使用,前者为选项名,后者为该选项的值。

Name有三个取值:

①ExpansionPoint:指定展开点,对应值可以是标量或向量。未设置时,展开点为0。

②Order:指定截断参数,对应值为一个正整数。未设置时,截断参数为6,即展开式的最高阶为5.

③OrderMode:指定展开式采用绝对阶或相对阶,对应值为 Absolute 或 Relative。未设置时取ABsolute。

泰勒级数展开为计算机处理复杂函数问题,提供了一种解决方案。因为泰勒级数可以将复杂的函数映射关系转化为计算机可以运算的四则运算。

%求泰勒级数展开
syms x;
f = (1+x+x^2)/(1-x+x^2);

T = taylor(f,x,1,'Order',6); %实现将符号表达式展开成泰勒级数
disp('Taylor 展开为:');
disp(T);
E = expand(T); %将展开的泰勒级数因式分解
disp('因式分解为:');
disp(E);


format short
clear
clc
%用x = pi点的泰勒展开,求cos(3)
syms x;
f = taylor(cos(x),x,pi)
x =3;
eval(f)

cos(3)

四、符号方程求解

1、代数方程符号求解

 在MATLAB中,求解用符号表达式表示的代数方程可由函数solve()实现,其调用格式为:

①solve(s):求解符号表达式s的代数方程,求解变量为默认变量。

②solve(s,v):求解符号表达式s的代数方程,求解变量为v。

③solve(s1,s2,...,sn,v1,v2,..,vn):求解符号表达式s1,s2,...,sn组成的代数方程组,求解变量分别为v1,v2,...,vn。

%代数方程符号求解
%例子,解方程ax^2 + bx + c =0
syms x a b c;
f = a*x^2+b*x+c; %省略了f = 0,所求得结果实际上是f = 0的根。
solve(f,x)

f = a*x^2+b*x+c == 0;%功能同上,表达的更加形象
solve(f)

利用solve()函数进行方程组求解时,所得到的结果不一定准确。

有的方程或方程组明明有解,但是solve()函数不一定能计算出 

2、常微分方程符号求解

 在MATLAB中,用大写字母D表示导数。

例如:Dy表示一阶导数y',D2y表示二阶导数y'',Dy(0)=5表示一阶导数在x = 0点的取值y'(0)。

D3y+D2y+Dy-x+5=0表示微分方程y'''+y''+y'-x+5=。

符号微分方程求解以通过函数dsolve来实现,其调用格式为:

                                dsolve(e,c,v)

用于求解常微分方程 e 在初值条件 c 下的特解。参数v是方程中的自变量,省略时按默认原则处理,若没有给出初值条件c,则求方程的通解。

dsolve在求常微分方程组时的调用格式为:

                                dsolve(e1,e2,...,en,c1,c2,...,cn,v)

用于求解常微分方程组e1,e2,...,en在初值条件c1,c2,...,cn下的特解,若不给出初值条件,则求方程组的通解。v给出求解变量,如果没有指定自变量,则采用默认自变量t。


clear
clc
%求微分方程或方程组的解
syms x y t;
%没有给出初始值,所以求通解
y = dsolve('Dy-(x^2+y^2)/(2*x^2)',x)

%同样没有初始值,所以也是通解
[u,v] = dsolve('Dx=4*x-2*y','Dy=2*x-y',t)


猜你喜欢

转载自blog.csdn.net/weixin_41949409/article/details/120355544