什么是微分方程式?
与一元一次方程可以解出来变量的具体值不同,微分方程式是关于函数的方程,解出来的是一个函数。例如微分方程
其中是积分常数(積分定数)。如果有一个初期条件是,即可解得。
这篇文章里会从零介绍一階微分方程式、二階微分方程式、偏微分方程式的解法,只需要掌握基础求导和积分的知识。
一/二階微分方程式:方程中最高是求一次或者二次导(微分),例如就是一个二階微分方程式。
常微分方程式:方程中只有一个变量,例如变量只有的方程式。
偏微分方程式: 方程中有两个以上的变量,例如包含和的方程组。
为了方便描述,
一階微分方程式
前進オイラー法
假设你不会解这个微分方程,只想知道函数在某个点近似的值,可以使用欧拉法近似。
对于每个点来说,把带入微分方程式中,可以计算出的数值,这个值其实就是函数在点的斜率。
那么可以从设定一个长度,从初始点开始,计算出横坐标所对应的的值;如此往复,直到计算出目标值。
显然,$h$的值越小,需要的计算次数越多,得到的结果越精确。
例:对于微分方程式
初期条件,令,计算的值。
解:可以画出下图的表格,方便计算。
代码实现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
using namespace std;
const int maxn = 1e5 + 10;
double x[maxn], y[maxn], A[maxn], h = 0.1;
double F(double x, double y){
return - (y / x) + 3 * x;
}
int main(){
x[0] = 1.0, y[0] = 4.0, A[0] = 0;
printf("y(?)=?\n");
scanf("%lf%lf",&x[0],&y[0]);
printf("h=?\n");
scanf("%lf",&h);
printf("ask for y(?)\n");
double End;
scanf("%lf", &End);
A[0] = F(x[0], y[0]);
int times = int((End - x[0]) / h);
for (int i = 1; i <= times; ++i) {
x[i] = x[i-1] + h;
y[i] = y[i - 1] + A[i - 1] * h;
A[i] = F(x[i], y[i]);
}
printf("-------------------------------------\n");
for (int i = 0; i <= times; ++i)
printf("%d %lf %lf %lf %lf\n", i, x[i], y[i], A[i], h * A[i]);
printf("y(%lf)=%lf", End, y[times]);
}
変数分離法
对于方程
我们可以把y和x有关的项分离,放到等号的两边,然后积分。
假设
例:
解:
同次形
如果和的次数一致,可以用替换,把方程化简以后可以使用変数分離法求解。
例:
这里引入一个新变量
带入方程中
積分因子法
对于以下形状的微分方程式
这里,积分因子u(x)定义为
如果把方程两边乘上积分因子,发现方程式左边其实变成了在微分以后的形式
例,在变数分离法的例题上用积分因子法,也能得到同样的结果
解:
参考文献
- 真貝寿明. (2010). 徹底攻略 常微分方程式.
- 微分方程式の数値解法. 東京大学工学部 精密工学科 プログラミング応用 I・ II. http://www.den.t.u-tokyo.ac.jp/ad_prog/ode/
- 予備校のノリで学ぶ「大学の数学・物理」. (2020).【大学数学】微分方程式入門 [Vedio]. Youtube. https://www.youtube.com/watch?v=po97dnBfoco
- NHCLDX. (2019). 第七章——微分方程. https://zhuanlan.zhihu.com/p/99271908