2016-12-11 5 views
1

私は、4つのODE:dX/dt = F(X)のシステムを考えてみましょう。ここでXはベクトル(4次元)で、F:R^4→R^4です。 FはvectorDE_total_functionと呼ばれ、私はRK-4を使って解を計算しようとしています。Runge-Kutta of fourthth

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; 

私はどこかに間違っているように見えますが、どこがわからないのですか。それは正当だと思われますか?

答えて

1

これを実装するのは奇妙で、めったに見られない方法であり、古典的なRK4のみで動作しますが、他のRunge-Kuttaメソッドはそのようには機能しません。しかし、一般的な考え方は正しいようです。

通常は予期せぬ場所によくあるエラーがあります。

temp_vector = previous_vector; 

以降

previous_vector = temp_vector; 

を設定すると、ベクトルのコピーを作成しますが、両方のオブジェクト参照が同じベクトルを共有することはありません。ベクトルデータのコピーを強制的に

temp_vector = previous_vector.copy(); 

または

previous_vector = temp_vector[:]; 

を使用してください。

+0

私は「何か」とは分かりません。割り当てよりむしろバインディングですか? – EzWin

+0

ベクトル変数は、実際のメモリオブジェクトへの参照またはポインタです。したがって、 '='はポインタのコピーです。おそらく、確かに、いくつかの参照カウントではありません。 - '+ ='も左辺のオブジェクトに作用しているので、 'a = a + b'とは異なり、新しいaが新しいオブジェクトで、' a + = b'の 'a'は以前と同じオブジェクト。したがって、 'temp_vector + = RK_vector/c;'はポインタの一致を破らず、 '' previous_vector''( "...")を "変更"します。 – LutzL

+0

だから、バインディングではありません。これは、2つのオブジェクトをあるイベント処理メカニズム、つまりオブジェクトAの変更によって同期させ、オブジェクトBのメソッドを呼び出すようにします。その種類のものはここにはありません。 – LutzL