Alex_McAvoy

想要成为渔夫的猎手

Matlab 符号方程

【概述】

方程,是含有未知数的等式,表示两个数学式之间的相等关系。

常见的方程有:

  • 代数方程:由多项式组成的方程
    • 按自变量类别分类:整式方程、分式方程、根式方程
    • 按线性关系分类:线性代数方程、非线性代数方程
  • 超越方程:包含超越函数的方程
  • 微分方程:微分方程,是指含有未知函数及其导数的关系式
    • 常微分方程:未知函数是一元函数
    • 偏微分方程:未知函数是多元函数

对于线性代数方程来说,无论是单个方程还是方程组,其只涉及符号对象的代数运算,利用消元法很容易即可得到所有解,相对比较简单。

对于非线性代数方程来说,很难得到精确解,一般利用牛顿迭代法或二分迭代法去求近似解

对于超越方程来说,对其求解没有一般的公式,难以求得解析解,一般是采用数值方法求数值解

对于微分方程来说,很可能无法得到解析解,甚至无法求解

注:

  • 超越函数:函数 $f(x)$ 不是 $x$ 的多项式时,常见的有对数函数、指数函数、三角函数、反三角函数等
  • 解析解:通过严格的公式所求得的解,给出解的具体形式,就可通过解的表达式来算出任何对应值
  • 数值解:给出一系列的自变量,利用数值分析方法求出的解,只能利用数值计算的结果,不能随意给出自变量求出具体值

【代数方程与超越方程求解】

在matlab中,对于代数方程和超越方程,可以直接利用 solve() 函数来求解,当方程不存在符号解又无其他自由参数时,将给出数值解。

  • s=solve(S):S 为符号表达式,自变量为默认变量,结果返回 S=0 的解组成的列向量
  • s=solve(S,var):S 为符号表达式,var 为指定的自变量,结果返回 S=0 的解组成的列向量
  • s=solve(S1,S2,...,Sn)S1,S2,...,Sn 为 n 个符号表达式,自变量为默认变量,结果返回 n 个方程组的解组成的结构体
  • s=solve(S1,S2,...,Sn,var1,var2,...,varm)S1,S2,...,Sn 为 n 个符号表达式,var1,var2,...,varm 为指定的 m 个自变量,结果返回 n 个方程组的解组成的结构体

说明:上述的默认变量是 symvar(s) 所返回的变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
>> syms x y z

% solve(S)
>> solve(x^2+x)
ans =
-1
0

% solve(S,var)
>> solve(x+y,x)
ans =
-y

% solve(S1,S2,...,Sn)
>> s=solve(2*x+y,x+2*y-1)
s =
x: [1x1 sym]
y: [1x1 sym]
>> s.x
ans =
-1/3
>> s.y
ans =
2/3

%solve(S1,S2,...,Sn,var1,var2,...,varm)
>> s=solve(2*x+y,x+2*y-z,x,y)
s =
x: [1x1 sym]
y: [1x1 sym]
>> s.x
ans =
-z/3
>> s.y
ans =
(2*z)/3

【符号微分方程求解】

常微分方程

在 matlab 中,常用 dsolve() 来求常微分方程的符号解。

格式:dsolve(S1,S2,...,cond1,cond2,...,var)

函数返回由符号表达式 S1,S2,... 指定的以 var 为自变量的常微分方程的符号解,cond1,cond2,...用于指定方程的边界条件或初始条件,若 var 为指定,则默认以 t 为自变量

例1:求 $x^2+y+(x-2y)y’=0$ 的通解

1
2
3
4
5
6
>> syms x y(x)
>> f=sym(x^2+y+(x-2*y)*diff(y))
>> s=dsolve(f)
s =
x/2 + ((4*x^3)/3 + x^2 + C1)^(1/2)/2
x/2 - ((4*x^3)/3 + x^2 + C1)^(1/2)/2

例2:求 $y’’’-y’’=x$ 在边界条件 $y(1)=8,y’(1)=7,y’’(2)=4$ 下的解

1
2
3
4
5
6
7
8
9
>> syms x y(x)
>> dy=diff(y),d2y=diff(y,2),d3y=diff(y,3);
>> f=sym(d3y-d2y==x)
>> s=dsolve(f,y(1)==8,dy(1)==7,d2y(2)==4)
s =
x*((exp(-1)*(19*exp(1) - 14))/2 - 1) + 7*exp(-2)*exp(x) - x^2/2 - x^3/6 + (exp(-1)*(19*exp(1) - 14))/2 - (exp(-1)*(25*exp(1) - 21))/3 - 1
>> s=simplify(s) % 对结果化简
s =
(17*x)/2 + 7*exp(x - 2) - 7*x*exp(-1) - x^2/2 - x^3/6 + 1/6

例3:求 $\left\{\begin{matrix}f’’+3g=sinx
\\g’+f’=cosx
\end{matrix}\right.$ 的通解与其在边界条件 $f’(2)=0,f(3)=3,g(5)=1$的解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>> syms x f(x) g(x)
>> df=diff(f),dg=diff(g),d2f=diff(f,2);
>> F1=sym(d2f+3*g==sin(x));
>> F2=sym(dg+df==cos(x));
% 通解
>> S1=dsolve(F1,F2);
>> simplify(S1.f)
ans =
C5 + sin(x)/2 + (3^(1/2)*C6*exp(3^(1/2)*x))/3 - (3^(1/2)*C7*exp(-3^(1/2)*x))/3
>> simplify(S1.g)
ans =
sin(x)/2 - (3^(1/2)*C6*exp(3^(1/2)*x))/3 + (3^(1/2)*C7*exp(-3^(1/2)*x))/3

% 特解
>> S2=dsolve(F1,F2,df(2)==0,f(3)==3,g(5)==1);
>> simplify(S2.f)
ans =
(18*exp(3^(1/2)*(x + 2)) - 6*exp(3^(1/2)*(2*x + 3)) - 6*exp(7*3^(1/2)) + 6*exp(3^(1/2)*(x + 4)) + 6*exp(3^(1/2)*(x + 6)) + 18*exp(3^(1/2)*(x + 8)) + 3*exp(3^(1/2)*(2*x + 3))*sin(5) + 3*exp(3^(1/2)*(x + 2))*sin(x) + 3*exp(3^(1/2)*(x + 8))*sin(x) - 3*exp(3^(1/2)*(x + 2))*sin(3) - 3*exp(3^(1/2)*(x + 4))*sin(5) - 3*exp(3^(1/2)*(x + 6))*sin(5) - 3*exp(3^(1/2)*(x + 8))*sin(3) + 3*exp(7*3^(1/2))*sin(5) + 3^(1/2)*cos(2)*exp(3^(1/2)*(x + 3)) - 3^(1/2)*cos(2)*exp(3^(1/2)*(x + 7)) + 3^(1/2)*cos(2)*exp(10*3^(1/2)) - 3^(1/2)*cos(2)*exp(2*3^(1/2)*x))/(6*(exp(3^(1/2)*(x + 2)) + exp(3^(1/2)*(x + 8))))
>> simplify(S2.g)
ans =
(6*exp(7*3^(1/2)) + 6*exp(3^(1/2)*(2*x + 3)) - 3*exp(3^(1/2)*(2*x + 3))*sin(5) + 3*exp(3^(1/2)*(x + 2))*sin(x) + 3*exp(3^(1/2)*(x + 8))*sin(x) - 3*exp(7*3^(1/2))*sin(5) - 3^(1/2)*cos(2)*exp(10*3^(1/2)) + 3^(1/2)*cos(2)*exp(2*3^(1/2)*x))/(6*(exp(3^(1/2)*(x + 2)) + exp(3^(1/2)*(x + 8))))
感谢您对我的支持,让我继续努力分享有用的技术与知识点!