Java中简单摆的Runge-Kutta方法

时间:2017-05-17 08:34:20

标签: java runge-kutta

我正在尝试研究Runge-Kutta方法并应用于简单的钟摆。使用时间步长dt = 0.1(h = 0.1),摆锤每个周期增加1%的能量......而在这个位置: Objects.requireNotNull() 能量减少约0.01%我做错了什么? 有一个软件,我可以在哪里比较我的计算值?感谢

     --Try This
    BEGIN TRAN
                    Declare @Strt INT,@End INT,@MaxNo INT
                    CREATE TABLE #TEMP_DATA (ID INT, VAL NVARCHAR(6),Premium INT)

                    INSERT INTO #TEMP_DATA
                    SELECT 1,'CH',201  UNION ALL
                    SELECT 1,'CH',0    UNION ALL
                    SELECT 1,'CHH',301 UNION ALL
                    SELECT 1,'CHS',401  UNION ALL
                    SELECT 1,'CHHS',501 UNION ALL
                    SELECT 1,'CHHS',0 


                    SELECT ID,Val,Premium,DENSE_RANK()OVER(ORDER BY Val) RN INTO #T
                    FROM #TEMP_DATA  

                    SET @Strt=1
                    SELECT @End= MAX(RN) FROM #T 

                        WHILE @Strt<=@End  BEGIN

                                 SELECT @MaxNo=MAX(RN)+1 FROM  #T 
                                 UPDATE #T SET RN= @MaxNo WHERE  Premium=0 AND RN=@Strt

                          SET @Strt=@Strt+1

                        END

                    SELECT * FROM #T
 ROLLBACK TRAN

link

1 个答案:

答案 0 :(得分:0)

要根据RK4理论得到结果,您应该使用参数中给出的状态来计算导数,而不是最后一个样本点处模型状态的全局变量。

double[] derivs(double xin, double yin[])
{
    double dydx[] = new double[N];
    /* function to fill array of derivatives dydx at xin */

    dydx[0] = yin[1]; 
    dydx[1] = -g/L1*Math.sin(yin[0]);
    /*        Error was here ^^^^^^^     */

    return dydx;
}

Runge-Kutta方法是为f(x,y)中的函数y'(x)=f(x,y(x))而设计的,这些函数只应依赖于这些输入变量或整个集成的全局常量。

您使用h代替derivs等时,您之前的代码在y[0]的每次评估中都会引入订单y[0]+0.5*k1[0]的错误,这会导致二次错误在RK步骤的水平。这意味着该方法与显式Euler方法一样好,具有全局错误顺序1。