C++ Program for Euler‘s Method 欧拉方法的 C++ 实现

绪论

从上面一篇手写计算逼近 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=xn1+Δ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=yn1+Δxdxdy(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(xn1)Δ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 120=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=xy2,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+2y1,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

测试

我们来验证上一个文章中的手写计算过程。下图为程序计算输出。
在这里插入图片描述手工计算过程如下图。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的老周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值