数学问题:
利用四阶Runge-Kutta算法求解常微分方程:
解决代码:
#include <iostream>
#include <iomanip>
using namespace std;
typedef void(*Func) (double x, int n, const double* y, double* dy);
void RK4(double x, double h, Func fun, int n, double* y)
{
int i = 0;
double* k1 = new double[n];
double* k2 = new double[n];
double* k3 = new double[n];
double* k4 = new double[n];
double* y2 = new double[n];
double* y3 = new double[n];
double* y4 = new double[n];
fun(x, n, y, k1);
for (i = 0; i < n; i++)
{
y2[i] = y[i] + h / 2 * k1[i];
}
fun(x + h / 2, n, y2, k2);
for (i = 0; i < n; i++)
{
y3[i] = y[i] + h / 2 * k2[i];
}
fun(x + h / 2, n, y3, k3);
for (i = 0; i < n; i++)
{
y4[i] = y[i] + h * k3[i];
}
fun(x + h, n, y4, k4);
for (i = 0; i < n; i++)
{
y[i] +=h / 6.0 * (k1[i] + 2 * k2[i] + 2 * k3[i] + k4[i]);
}
delete[] k1;
delete[] k2;
delete[] k3;
delete[] k4;
delete[] y2;
delete[] y3;
delete[] y4;
}
void fun3(double x, int n, const double* y, double* dy)
{
dy[0] = y[1];
dy[1] = 0.1 * (1 - y[0] * y[0]) * y[1] - y[0];
}
int main() {
int i;
double x = 0;
double h = 0.2;
double* y = new double[2];
cin >> x;
cin >> y[0] >> y[1];
cin >> h;
for (i = 0; i < 1; i++)
{
x = i * h;
RK4(x, h, fun3, 2, y);
cout << fixed << setprecision(5) << y[0] << " " << y[1] << endl;
}
delete[] y;
}
使用方法:
第一行输入x值;
第二行输入y(x)和y`(x)值;
第三行输入步长h。
测试输入:
0
1 1
0.2
预期输出:
1.17850 0.77803
问题解决:
计算结果为: