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

标签 c++ differential-equations

我收到一个以前从未发现的错误。关于这段代码是什么的一些背景知识,我正在用 Runge-Kutta 编写一个算法来求解二阶微分方程(钟摆相对于时间的角度)。

即使我正在打字,我也已经知道其中可能有很多错误。这是我第一次编码类(class)中的最终项目的一部分。我能得到的任何帮助,用最简单的语言,真的很有帮助!

这是错误代码

second_order.cpp: In function ‘double dxdt(double, double)’:
second_order.cpp:16:17: error: invalid operands of types ‘double’ and ‘time_t(time_t*)throw () {aka long int(long int*)throw ()}’ to binary ‘operator/’
    return theta/time;
                 ^

second_order.cpp: In function ‘int main()’:
second_order.cpp:51:22: error: cannot convert ‘time_t (*)(time_t*)throw () {aka long int (*)(long int*)throw ()}’ to ‘double’ for argument ‘1’ to ‘double dxdt(double, double)’
  kx1=dt*dxdt(time,x,v);
                      ^

second_order.cpp:52:28: error: cannot convert ‘time_t (*)(time_t*)throw () {aka long int (*)(long int*)throw ()}’ to ‘double’ for argument ‘1’ to ‘double dvdt(double, double, double, double)’
  kv1=dt*dvdt(time,x,v,coeff);
                            ^

second_order.cpp:53:22: error: invalid operands of types ‘time_t(time_t*)throw () {aka long int(long int*)throw ()}’ and ‘double’ to binary ‘operator+’
  kx2=dt*dxdt(time+dt/2,x+kx1/2,v+kv1/2);
                      ^

second_order.cpp:54:22: error: invalid operands of types ‘time_t(time_t*)throw () {aka long int(long int*)throw ()}’ and ‘double’ to binary ‘operator+’
  kv2=dt*dvdt(time+dt/2,x+kx1/2,v+kv1/2);
                      ^

second_order.cpp:55:22: error: invalid operands of types ‘time_t(time_t*)throw () {aka long int(long int*)throw ()}’ and ‘double’ to binary ‘operator+’
  kx3=dt*dxdt(time+dt/2,x+kx2/2,v+kv2/2);
                      ^

second_order.cpp:56:22: error: invalid operands of types ‘time_t(time_t*)throw () {aka long int(long int*)throw ()}’ and ‘double’ to binary ‘operator+’
  kv3=dt*dvdt(time+dt/2,x+kx2/2,v+kv2/2);
                      ^

second_order.cpp:57:19: error: invalid operands of types ‘time_t(time_t*)throw () {aka long int(long int*)throw ()}’ and ‘double’ to binary ‘operator+’
  kx4=dt*dxdt(time+dt,x+kx3,v+kv3);
                   ^

second_order.cpp:58:19: error: invalid operands of types ‘time_t(time_t*)throw () {aka long int(long int*)throw ()}’ and ‘double’ to binary ‘operator+’
  kv4=dt*dvdt(time+dt,x+kx3,v+kv3);
                   ^

make: *** [second_order.o] Error 1

这是我的代码

#include <iostream>
#include <cmath>

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

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

double dxdt( double timepassed, double theta )
    {
        return theta/time;
    }
double v = dxdt(theta1, timepassed);

double x = theta1;

double dvdt( double theta, double coeff, double x, double v)
    {
        return coeff*sin(x);
    }
double d2xdt2 = dvdt(timepassed, theta1, v, coeff);

int main(){
   double theta;
   double theta1;
   double h;
   double L;
   double timepassed;
   double time1;

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

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

double kx1,kv1;
double kx2, kv2;
double kx3, kv3;
double kx4, kv4;
double dt;
double x = theta1;

kx1=dt*dxdt(time,x,v);
kv1=dt*dvdt(time,x,v,coeff);
kx2=dt*dxdt(time+dt/2,x+kx1/2,v+kv1/2);
kv2=dt*dvdt(time+dt/2,x+kx1/2,v+kv1/2);
kx3=dt*dxdt(time+dt/2,x+kx2/2,v+kv2/2);
kv3=dt*dvdt(time+dt/2,x+kx2/2,v+kv2/2);
kx4=dt*dxdt(time+dt,x+kx3,v+kv3);
kv4=dt*dvdt(time+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);
}

最佳答案

你的代码有几个问题:

  1. 您不能使用变量 time,因为它没有声明。请改用 timepassed

  2. 您只能在其他函数中调用函数。如果您不在函数中,则不能通过调用运行时函数来初始化变量。将类似于 double v = dxdt(theta1, timepassed); 的这些行移动到 main 中。

  3. 不要在全局范围内初始化变量(这是允许的,但由于顺序问题我不鼓励这样做)。

  4. 在使用之前初始化变量,否则你会得到 UB .
  5. 您在不同范围内声明了具有相同名称的变量,例如 Lh。当您在 main 中使用 L 时,在全局范围内声明的 L 将为 shadowed .

关于c++ - Runge Kutta (RK4) C++ 错误代码中的二阶 DE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58934550/

相关文章:

c++ - 无法在 std::set 上使用 set_intersection

python - 如何将 ODE 系统与 FEM 系统相结合

python - 使用 scipysolve_ivp 作为带有额外参数的函数

julia - 如何访问 Julia 中神经 ODE 的训练参数?

java - Java 中导数近似的编码。没有输出值

python - 使用 python 内置函数进行耦合 ODE

c++ - 如何在 Linux 上读取目录中的文件?

c++ - 将元素随机插入 vector 时随机减速

c++ - Visual Studio 2013 - 调试中的变量值窗口

c++ - 在运行时使用 C++/boost 从资源中解析 .ini 文件