Matlab求解数学问题

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

你可能感兴趣的:(MATLAB)