四阶Range-Kutta方法求初值(C++实现)

综述:

        我们知道欧拉方法用到了一个点的函数值,是一阶方法,改进的欧拉方法用到了两个点的函数值,变成了二阶的方法,为了提高精度,用更多的节点的线性组合来计算y(x_{n+1})的近似值y_{n+1}

        构造时要求近似公式在(x_n,y_n)处的Taylor展开式与解y(x)x_n处的taylor展开式的前几项重合,从而使近似公式达到所需要的阶数。

        本文将以一具体微分方程为例,使用C++采用4阶RK方法对其求解。


目录

综述:

题目:

4阶R-K公式:

代码实现:

运行结果:

数值解与真实解比较:

总结:


题目:

用4阶R-K方法求初值问题

\left\{ \begin{array}{lr} y'=y-\frac{2x}{y} ,\quad 0\leqslant x \leqslant1& \\ y(0)=1 \end{array} \right.

的数值解,取步长h=0.2

4阶R-K公式:

\left\{ \begin{array}{lr} y_{n+1}=y_n+\frac{h}{6}(K_1+2K_2+2K_3+K_4) \\ K_2=f(x_n+_\frac{h}{2},y_n+\frac{h}{2}K_1)\\K_3=f(x_n+\frac{h}{2},y_n+\frac{h}{2}K_2)\\K_4=f(x_n+h,y_n+hK_3) \end{array} \right.

代码实现:

        高阶RK推导起来比欧拉和改进欧拉难不少,主要是选择合适的权值使得截断误差的阶变高,有一点需要注意当RK方法大于4阶后,会多偏导数的项改变权值不会使他为0。

        但是这个代码实现起来更加简单~

#include <iostream>
#include <iomanip>

using namespace std;

class RK
{
public:
	RK(double x0,double y0,int n,double h)
	{
		this->m_h = h;
		this->m_n = n;
		this->m_x = x0;
		this->m_y = y0;
	}
	double fun(double x,double y)//函数y'=y-2x/y
	{
		return (y - (x * 2.0) / y);
	}

	void RKfun()
	{
		double K1, K2, K3, K4;
		K1 = K2 = K3 = K4 = 0.0;
		double yn_next = 0.0;
		int n = this->m_n;
		double sh = this->m_h / 2.0;
		while (n)
		{
			K1 = fun(this->m_x,this->m_y);
			K2 = fun(this->m_x + sh, this->m_y + K1 * sh);
			K3 = fun(this->m_x + sh, this->m_y + K2 * sh);
			K4 = fun(this->m_x + this->m_h, this->m_y + this->m_h * K3);
			yn_next = this->m_y + sh/3.0 * (K1 + 2.0 * K2 + 2.0 * K3 + K4);
			cout << "n = " << this->m_n - n + 1 << "时:  " << "yn = " << setprecision(5)<<yn_next << endl;
			this->m_x += this->m_h;
			this->m_y = yn_next;
			n--;

		}
	}
	int m_n;
	double m_h;
	double m_x;
	double m_y;
};
int main()
{
	RK rk4(0, 1.0, 5, 0.2);
	rk4.RKfun();
	return 0;
}

运行结果:

数值解与真实解比较:

x_ny_ny(x_n)
0.21.18321.1832
0.41.34171.3416
0.61.48331.4832
0.81.61251.6125
1.01.73211.7321

        由上表可以看出4阶RK方法的精度很高,在x_n等于0.2 0.8 1.0处相等

总结:

        RK方法的导出基于Taylor展开,故它要求所求问题的解具有较高的光滑度。当解充分光滑时,4阶RK方法确实优于改进Euler方法。对于大量实际问题来说,四阶RK方法一般可以达到精度要求。但是如果解的光滑性差,4阶RK求解的效果不如改进Euler。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

芝士就是菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值