更新的Runge Kutta(RK4)C ++中的二阶DE错误代码

时间:2019-11-19 16:37:38

标签: c++ runge-kutta

这是Runge Kutta (RK4) 2nd order DE in C++ ERROR CODE

的更新版本

我仍然在使用代码方面遇到困难。也许这与我对Runge-Kutta的有限了解有关,但是当我运行此代码时,它不会产生输出。

#include <iostream> 
#include <cmath>

    //dvdt=-(g/L)*sin(theta)
    //v=dxdt

double dxdt( double timepassed, double theta )
        {
            return theta/timepassed;
        }

    double L;   
    double g=9.8;
    double coeff=-1*(g/L);

double dvdt( double timepassed,  double x, double v)
        {
            return coeff*sin(x);
        }

int main(){

// Standard Variables   
    double theta;
    double theta1;
    double h = 0.1;
    double L;
    double timepassed;
    double time1;

// Input and Output Printing
    std::cout << "Please input initial angle (in decimal radians), length of the pendulum (in meters) and the time desired (in seconds). Click ENTER key after each value."<<"\n";
    std::cin >> theta1;
    std::cin >> L;  
    std::cin >> timepassed;

// Specific Variable Declarations
    double coeff=-1*(g/L);
    double v = dxdt(theta1, timepassed);
    double x = theta1;
    double d2xdt2 = dvdt(timepassed, theta1, v);

// Defining K Values in Runge Kutta
    double kx1,kv1;
    double kx2, kv2;
    double kx3, kv3;
    double kx4, kv4;
    double dt;

kx1=dt*dxdt(timepassed,x);
kv1=dt*dvdt(timepassed,x,v);
kx2=dt*dxdt(timepassed+dt/2,x+kx1/2);
kv2=dt*dvdt(timepassed+dt/2,x+kx1/2,v+kv1/2);
kx3=dt*dxdt(timepassed+dt/2,x+kx2/2);
kv3=dt*dvdt(timepassed+dt/2,x+kx2/2,v+kv2/2);
kx4=dt*dxdt(timepassed+dt,x+kx3);
kv4=dt*dvdt(timepassed+dt,x+kx3,v+kv3);
x = x + (1.0/6.0)*(kx1 + 2*kx2 + 2*kx3 + kx4);
v = v + (1.0/6.0)*(kx1 + 2*kv2 + 2*kv3 + kv4);


std::cout << "The angle is" << x; "\n"; 
std::cout << "The velocity is" << v;

}

1 个答案:

答案 0 :(得分:0)

您的系统方程式应如其在前面的评论中所宣布的那样

//v=dx/dt
//dv/dt=d2x/dt2=-(g/L)*sin(x), where x=theta
double coeff;
double dxdt( double t, double x, double v) { return v; }
double dvdt( double t, double x, double v) { return coeff*sin(x); }

在输入参数后,将计算数字coeff,但不会重新声明。

// Specific Variable Declarations
    coeff = -(g/L);

您的步长似乎为0.1。您需要确定要使用的变量名hdt,然后保持不变

几乎可以肯定,您需要执行一个以上的RK4步骤,因此需要使用循环对其进行构图。该循环除了RK4阶段外还包含什么,取决于程序输出的内容。另外,如果目标时间不是时间步长的倍数,则需要调整最后一步。

    while(t < timepassed) {
        kx1=dt*dxdt(t,x,v);
        kv1=dt*dvdt(t,x,v);
        kx2=dt*dxdt(t+dt/2,x+kx1/2,v+kv1/2);
        kv2=dt*dvdt(t+dt/2,x+kx1/2,v+kv1/2);
        kx3=dt*dxdt(t+dt/2,x+kx2/2,v+kv2/2);
        kv3=dt*dvdt(t+dt/2,x+kx2/2,v+kv2/2);
        kx4=dt*dxdt(t+dt,x+kx3,v+kv3);
        kv4=dt*dvdt(t+dt,x+kx3,v+kv3);
        t = t + dt;
        x = x + (1.0/6.0)*(kx1 + 2*kx2 + 2*kx3 + kx4);
        v = v + (1.0/6.0)*(kx1 + 2*kv2 + 2*kv3 + kv4);
        // output for the step? Depending on the time?
    }