Matlab的符号计算★★★★

该博客为个人学习清风建模的学习笔记,代码全部摘自清风老师,部分课程可以在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
相关推荐
taoyong001几秒前
Java线程核心01-中断线程的理论原理
java·开发语言
一雨方知深秋1 分钟前
智慧商城:封装getters实现动态统计 + 全选反选功能
开发语言·javascript·vue2·foreach·find·every
海威的技术博客3 分钟前
关于JS中的this指向问题
开发语言·javascript·ecmascript
Sudo_Wang15 分钟前
力扣150题
算法·leetcode·职场和发展
qystca25 分钟前
洛谷 P1595 信封问题 C语言dp
算法
froginwe1129 分钟前
PostgreSQL表达式的类型
开发语言
委婉待续32 分钟前
java抽奖系统(八)
java·开发语言·状态模式
deja vu水中芭蕾34 分钟前
嵌入式C面试
c语言·开发语言
爱码小白35 分钟前
PyQt5 学习方法之悟道
开发语言·qt·学习方法
芳菲菲其弥章42 分钟前
数据结构经典算法总复习(下卷)
数据结构·算法