【问题标题】:Runge–Kutta of 4th order四阶龙格-库塔
【发布时间】:2016-12-11 02:41:53
【问题描述】:

假设我有一个 4 ODE 系统:dX/dt = F(X),其中 X 是向量(4 维),F:R^4 -> R^4。 F被称为vectorDE_total_function,我正在尝试使用RK-4计算解。

def solvingDES():
    previous_vector = np.array ([theta_1, omega_1, theta_2, omega_2]);
    for current_time in time:
        temp_vector = previous_vector;
        RK_vector = np.array([0.0,0.0,0.0,0.0]);
        for c in [6,3,3,6]:
            RK_vector = vectorDE_total_function(previous_vector + c * RK_vector/6) * time_step;
            temp_vector += RK_vector / c;
        previous_vector = temp_vector;
        current_time += 1;

看起来我在某个地方错了,但我不确定在哪里。看起来合法吗?

【问题讨论】:

    标签: python numpy numerical-methods runge-kutta


    【解决方案1】:

    这是一种奇怪的,很少见到的实现方式,它只适用于经典的 RK4,其他 Runge-Kutta 方法不能这样工作。但总体思路似乎是正确的。

    您在一个通常出乎意料的地方遇到了一个常见错误。设置

    temp_vector = previous_vector;
    

    以后

    previous_vector = temp_vector;
    

    您不制作向量的副本,而是让两个对象引用共享相同的向量。使用

    temp_vector = previous_vector.copy();
    

    previous_vector = temp_vector[:];
    

    强制复制矢量数据。

    【讨论】:

    • 我不确定 '=' 的作用。它是绑定的,而不是分配的?
    • 向量变量是对实际内存对象的引用或指针。因此= 正在做的是复制指针。可能,但不确定,有一些引用计数。 -- += 也作用于指向左侧的对象,因此与a=a+b 不同,其中新的a 是一个新对象,在a+=ba 是与以前相同的对象。因此temp_vector += RK_vector / c; 不会破坏指针重合,因此也会“更改”previous_vector(“...”,因为没有进一步的操作发生)。
    • 所以不,它不是绑定,因为它通过某种事件处理机制使两个对象保持同步,即对象 A 的更改导致调用对象 B 的方法。这里没有那种东西。
    • 我主要使用C代码,所以..你声称像b = a,a + = b这样的东西也会导致b改变?我认为 b 是通过引用传递的(即不是确切的内存地址,而是值)
    • 是的,我在一些 RK4 代码中确实发生了这种情况。 ylast=ycurr; ycurr+=h*k; 其中k 是 RK 步长的平均斜率,然后想知道为什么结果图在从最后一个值到当前值的插值中有这些奇怪的振荡。它需要显式添加 ycurr=ycurr+h*k; 才能获得正确的行为。
    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多