Matlab 求解数学问题
如果看完之后还是对相关函数的运用不甚了解,请务必使用 help 查看更详细的帮助文档!
求解一元 n 次方程
例:求解一元二次方程 x^2+2*x+1 = 0
clc, clear;
% 定义函数
syms f(x);
f = x^2 + 2*x +1;
% 利用 solve 函数求解方程
x = solve(f);
% 显示结果
disp(x);
求解方程组
例:求二元一次方程组
**
9x + 8y = 10 ①
13x + 14y = 12 ②
**
%% 求解多元方程组
clc, clear;
% 定义函数
syms f1(x,y) f2(x,y);
f1 = 9*x + 8*y - 10;
f2 = 13*x + 14*y - 12;
% 求解方程组
[x, y] = solve(f1, f2)
例:求非线性方程组
**
x^2 + y^2 = 10 ①
2x + 3y = 0 ②
**
%% 求解多元方程
clc, clear;
% 定义函数
syms f1(x,y) f2(x,y);
f1 = x^2 + y^2 - 10;
f2 = 2*x + 3*y;
% 求解方程组
[x, y] = solve(f1, f2)
求出来的结果是两个点的坐标,x 为横坐标, y为纵坐标。
求解符号解
求解符号解只需要我们利用 syms 函数在方程函数中声明符号变量就好了。
例:
%% 求解符号方程
clc, clear;
% 定义函数及变量 a, b, c
syms f1(x,y) f2(x,y) a b c;
f1 = a*x^2 + b*y^2 + c;
f2 = a*x + b*y + c;
% 求解方程组
[x, y] = solve(f1, f2)
解得的结果就是带 a, b, c 三个符号变量的符号解:
x =
-(c - (b*(c - (-(a*c*(a + b + c))/b)^(1/2)))/(a + b))/a
-(c - (b*(c + (-(a*c*(a + b + c))/b)^(1/2)))/(a + b))/a
y =
-(c - (-(a*c*(a + b + c))/b)^(1/2))/(a + b)
-(c + (-(a*c*(a + b + c))/b)^(1/2))/(a + b)
函数求导
%% 函数求导
clc, clear;
% 定义函数
syms y(x);
y = 2 * x^2;
% 求函数的导
Dy = diff(y); % 求函数的一阶导
D2y = diff(y, 2); % 求函数的二阶导
求解微分方程
下面的例子为输入 help dsolve 命令后,帮助文档中所给出的例子。
%% 求解常微分方程
clc, clear;
% 定义函数及变量
syms y(x) a;
% 函数微分方程
Dy = diff(y); % 求 y 的一阶导
D2y = diff(y, 2); % 求 y 的二阶导
%求解微分方程
dsolve(D2y == -a^2*y, y(0) == 1, Dy(pi/a) == 0)
注意: dsolve 求解微分方程的时候,如果里面求的为 n 阶导,那么后面对应给 n 个等式。(另外:是 ‘==’ 而不是 ‘=’ ,写的时候需要注意!)
求解不定积分
使用 int 函数求解不定积分:
%% 求解不定积分
clc, clear;
% 定义函数及常数 C
syms f(x) C;
f = sin(x)/x;
% 求解不定积分
int(f) + C
运行脚本后得到如下的结果:
ans =
C + sinint(x)
其中,sinint() 为正弦积分函数,返回 sin(x)/x 在区间 [0, x]之间的定积分,不是初等函数。
求解定积分
例:求函数 x^2*e^x 在 (0,1) 上的积分。
%% 求解定积分
clc, clear;
% 定义函数
syms f(x);
f = x^2*exp(x);
% 求解函数在 0 到 1 上的定积分
int(f, 0, 1)
结果化简及结果的美化
使用 simplify() 函数可以对结果进行化简。而使用 pretty() 函数可以把得到的结果以相对美观的方式输出。
%% 方程式的化简
clc, clear;
% 定义变量
syms a b;
f = 2*a + 4*b
% 化简
simplify(f)
%% 方程的美化
clc, clear;
% 定义变量
syms a b;
f = sqrt(a^2+b^2)/b
% 美化结果
pretty(f)
符号替换
当我们要给一个方程中的变量赋值的时候,我们可以采用 subs() 函数进行符号替换。当然我们也可以把其中的一个或一串字符替换成另一串字符。
%% 符号替换
clc, clear;
% 定义变量
syms a b;
f = a + b;
% 给 a, b 赋值
a = 2; b = 4;
% 变量替换
f2 = subs(f, {'a', 'b'}, {a, b})
求矩阵的行最简及求矩阵的秩
求矩阵的行最简可以使用 rref 函数;求矩阵的秩可以使用 rank 函数。
%% 求矩阵 A 的行最简
clc, clear;
% 定义矩阵
A = [1 1 -3 -1; 3 -1 -3 4; 1 5 -9 -8];
% 指定有理式格式
format rat
% 求矩阵 A 的行最简
S = rref(A)
% 求矩阵 A 的秩
rank = rank(A)
齐次线性方程组的通解
在 MATLAB 中, 函数 null 用来求解零空间,即满足 A·X = 0 的解空间,实际上是求出解空间的一组基。
格式:
z = null; % z 的列向量为方程组的正交规范基, 满足 Z' x Z = I
z = null(A, 'r'); % z 的列向量是方程 A·X = 0 的有理基
例:求解下列方程组的通解

matlab 求解程序代码如下:
A = [1 2 2 1; 2 1 -2 -2; 1 -1 -4 -3]; % 原始系数矩阵
format rat; % 指定有理式格式
B = null(A, 'r'); % 求解空间有理基
disp(B);
结果如下:
2 5/3
-2 -4/3
1 0
0 1
即:
2k1 + (5/3) k2 % 通解1
-2k1 + (-4/3) k2 % 通解2
k1
k2
我们也可以通过最简行得到基:
B = rref(A) % 求 A 的最简行
则相应的写出线性方程组的通解:
% 利用求解空间的有理基继续运算
syms k1 k2; % 定义字符变量
X = k1*B(:, 1) + k2*B(:, 2) % 得到方程组的通解
非齐次线性方程组的通解
需要先判断非齐次线性方程组是否有解,若有解,然后求通解,步骤如下。
Step1:判断 A·X = b 是否有解,若有解,则进行第二步,否则求解终止;
Step2:求 A·X = b 的一个特解;
Step3:求 A·X = 0 的通解
Step4:求 A·X = b 的通解等于 A·X = 0 的通解加上 A·X = b 的一个特解。
例:求解方程组

在 MATLAB 中建立脚本 M 文件:
clc, clear;
A = [1 -2 3 -1; 3 -1 5 -3; 2 1 2 -2]; % 原始系数矩阵
b = [1 2 3]'; % 解析矩阵
B = [A b]; % 增广矩阵
n = 4;
RA = rank(A) % 求 A 的秩
RB = rank(B) % 求 B 的秩
format rat % 指定有理式格式
if RA==RB && A==n % 判断是否有唯一解
X = A \ b
elseif RA==RB && RA
运行后的结果为:
RA =
2
RB =
3
X =
equition no solve