Matlab的符号计算★★★★

avatar
作者
筋斗云
阅读量:0

该博客为个人学习清风建模的学习笔记,代码全部摘自清风老师,部分课程可以在B站:【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili 

目录

1创建符号变量

1.1符号变量

1.2符号方程

1.3符号矩阵

2简单运算

3符号表达式的整理

3.1化简-simplify

3.2因式分解-factor

3.3多项式展开-expand

3.4合并-collect

3.5计算分子分母-numden

3.6自然化结果

4符号函数求导

4.1一元函数-diff(y,n)

4.2多元函数-diff(y,x,n)

4.3矩阵差分-diff(A,n,d)

5积分

5.1不定积分-int(y,x)

5.2定积分-int(y,x,a,b)

5.3数值积分-integral(y,a,b)

6求解方程

6.1单变量方程-solve(eqn,x)

6.2多变量方程-solve(eqn,x)

6.3方程组-solve(eqn,[u,v])

6.4solve函数问题

6.5vpasovle(eqn,x,[a,b])函数-指定搜索范围

6.6fsolve函数


名称重要性难度
Matlab的符号计算★★★★★★★

1创建符号变量

1.1符号变量

% 简单符号变量的创建 syms x  % 观察工作区, sym是symbolic的缩写 syms a b c

1.2符号方程

% 符号方程的创建,两种方法 syms a x y = a*x+x^2 % y = str2sym('a*x+x^2')  %Matlab 2017b 版本后推出

1.3符号矩阵

% 符号矩阵 syms alpha M = [cos(alpha)  -sin(alpha);        sin(alpha)  cos(alpha)]

2简单运算

%% 简单运算 syms a b c d e y = a + b % a + b x = c - d % c - d y1 = x*y % (a + b)*(c - d) y2 = y1/y % c - d y3 = y1^3 % (a + b)^3*(c - d)^3 y4 = sqrt(y3)    % ((a + b)^3*(c - d)^3)^(1/2) y5 = exp(y4) % exp(((a + b)^3*(c - d)^3)^(1/2))

3符号表达式的整理

3.1化简-simplify

% 化简 syms a y=(cot(a/2)-tan(a/2))*(1+tan(a)*tan(a/2)) simplify(y) % 2/sin(a)

3.2因式分解-factor

%% 因式分解 factor(12) % 对常数进行因式分解  %      2     2     3 syms m n x y = -24*m^2*x-16*n^2*x factor(y) % [ -8, x, 3*m^2 + 2*n^2] y1=m^3-n^3 factor(y1) % [ m - n, m^2 + m*n + n^2]

3.3多项式展开-expand

%% 多项式展开 syms a x y = a*(x^2-a)^2+(x-2) expand(y) % a^3 - 2*a^2*x^2 + a*x^4 + x - 2

3.4合并-collect

%% 合并 syms x y z = (x+y)^2*y+5*y*x-2*x^3 % expand(z)   - 2*x^3 + x^2*y + 2*x*y^2 + 5*x*y + y^3 collect(z,x) % y*x^2 - 2*x^3 + (2*y^2 + 5*y)*x + y^3 collect(z,y) % y^3 + 2*x*y^2 + (x^2 + 5*x)*y - 2*x^3 

3.5计算分子分母-numden

%% 计算分子与分母 % [z1,z2] = numden(2.5)  % 会报错,因为numden的输入变量不能是数值,只能是符号变量 % ans = sym(2.5);  % sym函数可以将数值2.5转换为符号 [z1,z2] = numden(sym(2.5)) % 对常数计算分子与分母 % z1 = 5 % z2 = 2 syms x y z = 1/x*y+x/(x^2-2*y) [z1,z2] = numden(z)  %z1分子,z2分母 % z1 = - x^2*y - x^2 + 2*y^2 % z2 = x*(- x^2 + 2*y) 

3.6自然化结果

syms x y M = (1/x*y+x/(x^2-2*y)-x^2/(3+y)^2)^2; expand(M)   % y^2/x^2 + x^4/(y^4 + 12*y^3 + 54*y^2 + 108*y + 81) + (2*x^3)/(- x^2*y^2 - 6*x^2*y - 9*x^2 + 2*y^3 + 12*y^2 + 18*y) - (2*y)/(- x^2 + 2*y) + x^2/(x^4 - 4*x^2*y + 4*y^2) - (2*x*y)/(y^2 + 6*y + 9)  % 新建实时脚本,将上述代码放在实时脚本中运行 

4符号函数求导

4.1一元函数-diff(y,n)

diff(y,n):对y函数求n次导数

% 一元函数的导数 syms x y = x^4-5*x^2+6 diff(y) %求一阶导数 % 4*x^3 - 10*x diff(y,2) %求二阶导数 % 12*x^2 - 10  y = cos(x)*tan(x) dy = diff(y,10)  %求十阶导数 simplify(dy) y = sin(x)*tan(x) dy = diff(y,10)  %求十阶导数 simplify(dy)

4.2多元函数-diff(y,x,n)

diff(y,x,n):在y函数中对x求n次偏导

% 多元函数的导数 syms x1 x2 x3 y1 = x1^5*x2+x2*x3-x1^2*x3 py1 = diff(y1,x1,1) % 对x1求一阶偏导 % 5*x2*x1^4 - 2*x3*x1 py2 = diff(y1,x1,2) % 对x1求二阶偏导 % 20*x2*x1^3 - 2*x3 py3 = diff(y1,x1,x2) % 先对x1求偏导,再对x2求偏导 % 5*x1^4 py4 = diff(y1,x2,x1) % 先对x2求偏导,再对x1求偏导 % 5*x1^4

4.3矩阵差分-diff(A,n,d)

diff(A,n,d):对A矩阵进行n次差分,若d为1则在行上进行差分,否则表示为在列上进行差分

%% 注意,如果diff函数作用的对象不是符号函数,而是矩阵,那么对应的功能是求差分。 A=[4 5 6 3 2 1]; diff(A)  % 求向量A的一阶差分     1     1    -3    -1    -1 diff(A,2)  % 在一阶差分的基础上再差分一次     0    -4     2     0  A=[4 5 6;       7 4 2;      5 6 2] A1=diff(A)  % 下一行减去上一行求一阶差分 %      3    -1    -4 %     -2     2     0 A2=diff(A,2) % 下一行减去上一行求二阶差分(在一阶差分的基础上再差分一次) %     -5     3     4 A3=diff(A,2,1) % 最后面的1表示在行上进行差分(在列的方向上进行差分) %     -5     3     4 A4=diff(A,1,2)  % 后一列减去前一列求一阶差分, 最后面的2表示在列上进行差分(在行的方向上进行差分) %      1     1 %     -3    -2 %      1    -4 A4=diff(A,2,2) % 后一列减去前一列求二阶差分 %      0 %      1 %     -5

5积分

5.1不定积分-int(y,x)

int(y,x):在y函数上面对x求不定积分

syms x y = x^2 int(y,x) % x^3/3 注意,Matlab计算时不会给我们加上常数C  syms x y = 1/x int(y,x) % log(x)  注意,Matlab计算1/x形式的不定积分时不会给我们加上绝对值~  syms x y = x^2 / (1+x^2) int(y,x) % x - atan(x)  syms x y = 1/(exp(x)+1) int(y,x) % x - log(exp(x) + 1)  syms x a y = 1/sqrt(x^2-a^2) int(y,x) % log(x + (x^2 - a^2)^(1/2))

5.2定积分-int(y,x,a,b)

int(y,x,a,b):在y函数上面对x求定积分,a为上界,b为下界

syms x y = sin(x) int(y,x,0,pi/2)  % 1  syms x a b y = exp(x) int(y,x,a,b) % exp(b) - exp(a)  syms x y = (sin(x))^2 / x^2 b=int(y,x,0,+inf) % pi/2  % 注意,不是所有的函数都可以利用int函数计算出最后的结果,例如: syms x y = 1 / exp(x) * log(x+2*x^2+sin(x)) int(y,x,0,4) % int(exp(-x)*log(x + sin(x) + 2*x^2), x, 0, 4)

5.3数值积分-integral(y,a,b)

integral(y,a,b):在y函数上取范围为[a,b]的数值积分

% 我们可以计算数值积分:数值积分可用于求定积分的近似值。在数值分析中,数值积分是计算定积分数值的方法和理论。 % 在数学分析中,给定函数的定积分的计算不总是可行的,许多定积分不能用已知的积分公式得到精确值。 y = @(x) 1 ./ exp(x) .* log(x+2.*x.^2+sin(x))  % 注意,写成函数句柄时,要用点乘或者点除 integral(y,0,4)

6求解方程

6.1单变量方程-solve(eqn,x)

solve(eqn,x):对eqn单变量方程中未知数x求解

%% 例题1: 求解单变量方程 syms x eqn = (sin(x) == 1);  % eqn = sin(x) == 1;   answ = solve(eqn, x)

6.2多变量方程-solve(eqn,x)

solve(eqn,x):对eqn多变量方程中未知数x求解

%% 例题2: 多变量方程求解 clear;clc syms a b c x eqn = (a*x^2 + b*x + c == 0); answ1 = solve(eqn, x)  % 将x视为未知数求解  %  -(b + (b^2 - 4*a*c)^(1/2))/(2*a) %  -(b - (b^2 - 4*a*c)^(1/2))/(2*a)

6.3方程组-solve(eqn,[u,v])

solve(eqn,[u,v]):对eqn方程组中的未知数u,v求解

%% 例题3:方程组求解 clear;clc syms u v a eqn = [2*u + v == a, u - v == 1]; answ = solve(eqn, [u, v]) answ.u answ.v [answ_u, answ_v] = solve(eqn, [u, v])

6.4solve函数问题

solve函数可能找不到很精密的符号函数解,就会发出警告,因此使用下面俩种函数更好。

%% solve 可能会警告 syms x eqn = (sin(x) == x^2 - 1); solve(eqn, x)  % 警告: Cannot solve symbolically. Returning a numeric approximation instead. 

6.5vpasovle(eqn,x,[a,b])函数-指定搜索范围

vpasovle(eqn,x,[a,b]):在给定方程eqn上,在x处于[a,b]范围下求解未知数x

%% vpasolve函数求解 % 用vpasolve函数指定求[0 2]上的解 syms x eqn = sin(x) == x^2 - 1; vpasolve(eqn, x, [0 2])

6.6fsolve函数

fsolve函数实在vpasovle函数基础上的改进,求解功能最强大

%% fsolve函数(求解功能最为强大哦) % fsolve是Matlab优化工具箱中的一个函数,可专门用来求解特别复杂的方程和方程组 x0 = [0,0];  % 初始值 result_x = fsolve(@my_fun,x0)
% 自定义的my_fun函数   function F = my_fun(x)     F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);     F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5; end

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!