java - 如何使用龙格-库塔法 (RK4) 求解牛顿冷却定律

标签 java for-loop math runge-kutta

我需要帮助实现我的工作四阶龙格-库塔方法来求解牛顿冷却定律。由于这个问题引入了时间(t),所以我对给定条件下的排名感到困惑。给出的内容如下:时间间隔从 t = 0 开始到 t = 20(以秒为单位),对象温度 = 300,环境温度 = 70,时间增量为 0.1,比例常数 = 0.19

public class RungeKutta {

public static double NewtonsCoolingLaw(double objectTemp,double  ambientTemp)
     {
         double k = 0.19;       
         return -k * (objectTemp - ambientTemp);
     }

public static void main(String[] args) {

    double result = 0.0;  
    double  initialObjectTemp = 300.0, givenAmbientTemp = 70.0;
    double deltaX = (20.0 - 0)/10000;

    for(double t = 0.0; t <= 20.0; t += .1)
    {        
        double k1 = deltaX * NewtonsLaw(initialObjectTemp,givenAmbientTemp);
        double k2 = deltaX * NewtonsLaw(initialObjectTemp + (deltaX/2.0),givenAmbientTemp + (k1/2.0));
        double k3 = deltaX * NewtonsLaw(initialObjectTemp + (deltaX/2.0), givenAmbientTemp + (k2/2.0));
        double k4 = deltaX * NewtonsLaw(initialObjectTemp + deltaX, givenAmbientTemp + k3);
        givenAmbientTemp = givenAmbientTemp + (1.0/6.0) * (k1 + (2.0 * k2) + (2.0 * k3) + k4);
        result = givenAmbientTemp;
    }       
    System.out.println("The approx. object temp after 20 seconds is: " + result);

}

}

贝娄是我求解 ODE 的 RK4 方法。在下面的代码中,我求解 ODE y' = y - x 以近似 y(1.005),前提是 y(1) = 10 且 delta x = 0.001

public class RungeKutta {

public static double functionXnYn(double x,double  y)
     {
         return y-x;
     }

public static void main(String[] args) {

    double deltaX = (1.005 - 0)/10000;
    double y = 10.0;
    double result = 0.0;  

    for(double x = 1.0; x <= 1.005; x = x + deltaX)
    {
        double k1 = deltaX * functionXnYn(x,y);
        double k2 = deltaX * functionXnYn(x + (deltaX/2.0),y + (k1/2.0));
        double k3 = deltaX * functionXnYn(x + (deltaX/2.0), y + (k2/2.0));
        double k4 = deltaX * functionXnYn(x + deltaX, y + k3);
        y = y + (1.0/6.0) * (k1 + (2.0 * k2) + (2.0 * k3) + k4);
        result = y;
    }       
    System.out.println("The value of y(1.005) is: " + result);

}

}

根据公式 T(t) = Ts + (T0 - Ts) * e^(-k*t) 我应该得到 75.1 的近似值来求解牛顿 DE。 Ts = 环境温度,T0 = 物体初始温度,t = 20(经过秒数),k = .19 比例常数

最佳答案

我猜测(但并不难)您要解决的 ODE 是

dT(t)/dt = -k*(T(t)-T_amb)

正如您所看到的,右侧并不直接取决于时间。 由于您没有尝试为系统编写代码,因此环境温度 T_amb 很可能是一个常量。因此,移动常量并使用一致的函数名称,并将 ODE 函数参数返回为格式时间,状态变量

public class RungeKutta {

    public static double CoolingLaw(double time, double objectTemp)
         {
             double k = 0.19, ambientTemp = 70.0;     
             return -k * (objectTemp - ambientTemp);
         }

    public static void main(String[] args) {

        double result = 0.0;  
        double  objectTemp = 300.0;
        double dt = 0.1

        for(double t = 0.0; t <= 20.0; t += dt)
        {        
            double k1 = dt * CoolingLaw(t, objectTemp);
            double k2 = dt * CoolingLaw(t + (dt/2.0), objectTemp + (k1/2.0));
            double k3 = dt * CoolingLaw(t + (dt/2.0), objectTemp + (k2/2.0));
            double k4 = dt * CoolingLaw(t + dt, objectTemp + k3);
            objectTemp = objectTemp + (1.0/6.0) * (k1 + (2.0 * k2) + (2.0 * k3) + k4);
            result = objectTemp;
        }       
        System.out.println("The approx. object temp after 20 seconds is: " + result);

    }


}

关于java - 如何使用龙格-库塔法 (RK4) 求解牛顿冷却定律,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56412486/

相关文章:

c++ - 我的 For 循环出现段错误

c++ - c 中的埃拉托色尼筛

java - 奇怪的错误。 "return mFragmentList.get(position);"行不兼容类型错误

java - 无法为 JSP 编译此类

java - 将 .txt 中的行读取到对象表中

java - 自定义领域问题

java - 将管道添加到java中的值

vba - For Each 循环 : Some items get skipped when looping through Outlook mailbox to delete items

c++ - 对以下 c/c++ 解决方案的逻辑解释

javascript - 在线数学编辑器和评估引擎