2011-10-29 16 views
1

こんにちは、これは私にとって非常に問題なのかもしれませんが、私は固執していますし、しばらくの間これをやろうとしています。MATLABの無名関数内で匿名関数を作成しよう

私はこのような何かをしようとしている:

a=0.5; 
ODE= @(x,y) ((-2*(a^2)*x*y)/(x^2+y^2)^2)/(1-((a^2)*(x^2-y^2)/(x^2+y^2)^2)); 


%The classical RK4 solution as a function 
k1 = ODE(x,y); 
k2 = ODE(x+0.5*dx,y+k1*0.5*dx); 
k3 = ODE(x+0.5*dx,y+k2*0.5*dx); 
k4 = ODE(x+dx,y+k3*dx); 
rk4= @(x,y,dx) y + 1/6*(k1 + 2*(k2+k3) + k4)*dx; 

だから私は、最初の無名関数としてODEを定義し、その後、私はODEからKさんとKさんから最後にRK4を定義しようとしています。

しかし、これは機能しません。どのような提案をするか?

答えて

2

​​〜k4は、機能として定義または使用されていません。 k1 = ODE(x,y)を宣言すると、ベクトルxyが定義されていないODE関数を評価しようとします。あなたはおそらく何を言っているのですか:

k1 = @(x,y,dx) (ODE(x,y)); 
k2 = @(x,y,dx) (ODE(x+0.5*dx,y+k1(x,y,dx)*0.5*dx)); 
k3 = @(x,y,dx) (ODE(x+0.5*dx,y+k2(x,y,dx)*0.5*dx)); 
k4 = @(x,y,dx) (ODE(x+dx,y+k3(x,y,dx)*dx)); 
rk4= @(x,y,dx) (y + 1/6*(k1(x,y,dx) + \ 
       2*(k2(x,y,dx)+k3(x,y,dx)) + \ 
       k4(x,y,dx))*dx); 
+0

ありがとうございました。 私は質問があります。 rk4を計算する別の関数ファイルを定義したければ、どうすればよいですか? 私は関数ファイルで@(..)を使用することはできません。交換は何ですか? – user1020121

+0

通常の関数の本体で匿名関数を定義することはできます。関数ファイルが 'function rk4 = RK4(ODE、x、y、dx)'で始まる場合、本体は上記のコードになります。 '@(x、y、dx)'がrk4行から削除されました。 – user57368

+0

ありがとうございました。私は今、関数のロジックを理解しています。 – user1020121