龙格-库塔方法的设计思想:
四阶龙格-库塔方法的经典格式:
程序设计框图:
例:设取步长h=0.2,从x=0到x=1用四阶经典格式解决以下常微分方程的初值问题。
- 运行示例:
- 源码:
#include<iostream>
#include<iomanip>
double f(double x, double y);
double f1(double x);
using namespace std;
int main(void)
{
double x0, y0, h; //x0,y0为初值;h为步长
double x1, y1; //步进后的新值
double K1, K2, K3, K4; //四阶经典格式中的斜率
int N; //N为步数
cout << "请输入初值:";
cin >> x0 >> y0;
cout << "请输入步长:";
cin >> h;
cout << "请输入步数:";
cin >> N;
//输出提示信息
int i = 1;
cout << "\t" << setw(10) << "xn" << "\t" << setw(10) << "yn" << "\t" << setw(10) << "y(xn)" << endl;
for (i; i <= N; i++)
{
x1 = x0 + h; //离散点
//求斜率
K1 = f(x0, y0);
K2 = f(x0 + h / 2, y0 + h / 2 * K1);
K3 = f(x0 + h / 2, y0 + h / 2 * K2);
K4 = f(x1, y0 + h * K3);
//求新值
y1 = y0 + h / 6 * (K1 + 2 * K2 + 2 * K3 + K4);
//输出本次步进后的离散点数据
cout << i << "\t" << setw(10) << x1 << "\t" << setw(10) << y1 << "\t" << setw(10) << f1(x1) << endl;
//把新的值赋给旧值,开启下一趟循环
x0 = x1;
y0 = y1;
}
return 0;
}
double f(double x, double y) //欧拉格式中的x,y的函数关系式,即f(xn,yn)
{
double result;
result = y - 2 * x / y;
return result;
}
double f1(double x) //实际函数解析式
{
double result;
result = sqrt(1 + 2 * x);
return result;
}