我正在尝试研究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
答案 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。