【概述】
方程,是含有未知数的等式,表示两个数学式之间的相等关系。
常见的方程有:
- 代数方程:由多项式组成的方程
- 按自变量类别分类:整式方程、分式方程、根式方程
- 按线性关系分类:线性代数方程、非线性代数方程
- 超越方程:包含超越函数的方程
- 微分方程:微分方程,是指含有未知函数及其导数的关系式
- 常微分方程:未知函数是一元函数
- 偏微分方程:未知函数是多元函数
对于线性代数方程来说,无论是单个方程还是方程组,其只涉及符号对象的代数运算,利用消元法很容易即可得到所有解,相对比较简单。
对于非线性代数方程来说,很难得到精确解,一般利用牛顿迭代法或二分迭代法去求近似解。
对于超越方程来说,对其求解没有一般的公式,难以求得解析解,一般是采用数值方法求数值解
对于微分方程来说,很可能无法得到解析解,甚至无法求解
注:
- 超越函数:函数 $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(x^2+x) ans = -1 0
>> solve(x+y,x) ans = -y
>> 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
>> 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))))
|