绪论
从上面一篇手写计算逼近 ODE 文章的计算过程中,我们知道使用欧拉方法求解的时候,初始条件为以下几个:
1、
x
x
x 的初始值。即
x
0
x_0
x0。
2、
f
(
x
)
f(x)
f(x)。即
y
0
y_0
y0。
3、
Δ
x
\Delta x
Δx。即迭代的步长。
4、
f
′
(
x
)
f'(x)
f′(x) 函数。
以下几个是需要迭代计算的:
1、下一个
x
x
x 的值。
x
n
=
x
n
−
1
+
Δ
x
x_n=x_{n-1}+\Delta x
xn=xn−1+Δx。
2、下一个
y
y
y 的值。
y
n
=
y
n
−
1
+
Δ
x
∗
d
y
d
x
(
x
0
,
y
0
)
y_n=y_{n-1}+\Delta x*\frac{dy}{dx}_{(x_0, y_0)}
yn=yn−1+Δx∗dxdy(x0,y0)。
3、在
(
x
,
y
)
(x,y)
(x,y) 点的
d
y
d
x
\frac{dy}{dx}
dxdy 数据。
C++ 程序设计
难点
f ′ ( x ) f'(x) f′(x) 函数的实现。根据欧拉迭代方法: Δ y n = f ′ ( x n − 1 ) Δ x \Delta y_n = f'(x_{n-1})\Delta x Δyn=f′(xn−1)Δx。
程序设计
主框架
用于提示用户输入 x 0 x_0 x0、 y 0 y_0 y0、 Δ x \Delta x Δx、迭代的步数和整个迭代过程。
#include <iostream>
using namespace std;
/*f'(x)函数*/
double df(double x, double y);
int main() {
//变量定义
double x0, y0;//起点坐标
double xn;//终点坐标
int step;//迭代次数
cout<<"Enter Initial Condition x0:\n";
cin>>x0;
cout<<"Enter Initial Condition y0:\n";
cin>>y0;
cout<<"Enter calculation point xn =\n";
cin>>xn;
cout<<"Enter number of steps:\n";
cin>>step;
double delta;//x的增量
delta=(xn-x0)/step;
//欧拉迭代
double x=x0, y=y0;
double slope=df(x, y);
cout<<"Step\tx\ty\tslope\n";
cout<<"Step 0:\t"<<x<<"\t"<<y<<"\t"<<slope<<"\n";
for (int i=1; i<=step; i++) {
y=y+delta*slope;
x=x+delta;
slope=df(x, y);
cout<<"Step "<<i<<":\t"<<x<<"\t"<<y<<"\t"<<slope<<"\n";
}
return 0;
}
f ′ ( x ) f'(x) f′(x) 实现
f ′ ( x ) f'(x) f′(x) 函数作为一个外部函数,根据具体问题来实现。
样例
样例 1
给定方程 d y d x = y , y ( 0 ) = 1 \frac{dy}{dx}=y, y(0)=1 dxdy=y,y(0)=1,请用 Δ x = 1 \Delta x=1 Δx=1,求 y ( 2 ) y(2) y(2) 的值。
输入
根据题目,我们知道以下条件: x 0 = 0 x_0=0 x0=0、 y 0 = 1 y_0=1 y0=1、 Δ x = 1 \Delta x=1 Δx=1、迭代次数为 2 − 0 1 = 2 \frac{2-0}{1}=2 12−0=2。
f ′ ( x ) f'(x) f′(x) 实现
double df(double x, double y) {
return y;
}
编译
我使用 Win10 + MinGW 的 g++ 来编译。
g++ -g -o Euler.exe main.cpp df1.cpp
测试
我们来验证上一个文章中的手写计算过程。输入条件为:
x
0
=
0
,
y
0
=
1
,
x
n
=
2
,
Δ
x
=
1
x_0=0,y_0=1,x_n=2,\Delta x=1
x0=0,y0=1,xn=2,Δx=1。下图为程序计算输出。
从上图中可以看出
f
(
2
)
=
4
f(2)=4
f(2)=4。和手写计算过程做一个比对,如下图。
我们可以看到,计算机计算和手写过程输出是一样的。
样例 2
给定方程 d y d x = x − y − 2 , y ( − 1 ) = 3 \frac{dy}{dx}=x-y-2, y(-1)=3 dxdy=x−y−2,y(−1)=3,请用 Δ x = 1 \Delta x=1 Δx=1,求 y ( 2 ) y(2) y(2) 的值。
输入
根据题目,我们知道以下条件: x 0 = − 1 x_0=-1 x0=−1、 y 0 = 3 y_0=3 y0=3、 Δ x = 1 \Delta x=1 Δx=1、迭代次数为 2 − ( − 1 ) 1 = 3 \frac{2-(-1)}{1}=3 12−(−1)=3。
f ′ ( x ) f'(x) f′(x) 实现
double df(double x, double y) {
return x-y+2;
}
编译
我使用 Win10 + MinGW 的 g++ 来编译。
g++ -g -o Euler.exe main.cpp df2.cpp
测试
我们来验证上一个文章中的手写计算过程。下图为程序计算输出。
下图为手工计算的过程。
我们可以看到,计算机计算和手写过程输出是一样的。
样例 3
给定方程 d y d x = 3 x + 2 y − 1 , y ( 0 ) = − 0.2 \frac{dy}{dx}=3x+2y-1, y(0)=-0.2 dxdy=3x+2y−1,y(0)=−0.2,请用 Δ x = 2 \Delta x=2 Δx=2,求 y ( 2 ) y(2) y(2) 的值。
输入
根据题目,我们知道以下条件: x 0 = 0 x_0=0 x0=0、 y 0 = − 0.2 y_0=-0.2 y0=−0.2、 Δ x = 2 \Delta x=2 Δx=2、迭代次数为 2 − ( 0 ) 2 = 1 \frac{2-(0)}{2}=1 22−(0)=1。
f ′ ( x ) f'(x) f′(x) 实现
double df(double x, double y) {
return 3*x+2*y-1;
}
编译
我使用 Win10 + MinGW 的 g++ 来编译。
g++ -g -o Euler.exe main.cpp df2.cpp
测试
我们来验证上一个文章中的手写计算过程。下图为程序计算输出。
手工计算过程如下图。