2017-07-25 13 views
1

以下のコードでfsolveを使用しようとしていますが、エラーが発生して修正方法を知りません。参考までに、私は入力引数として(1/2,1,1,1/2,0)を使用します。二次関数を解く際にfsolveエラーが発生する

function [ B_A , A_B ] = SecondOrderSimulation(delta,c1,c2,s0,m2A_Current) 
m1A_Current = (-delta -c2*m2A_Current)/c1; 
m1B_Current = 0; 
m2B_Current = 0; 
syms t positive; 
B_A = []; 
A_B = []; 
    for k = 0:5 
     if mod(k,2)==0 || k==0 %if k is even/interval A_n to B_n 
      f = c1*(m1A_Current + (1+s0)*t) +c2*(m2A_Current + m1A_Current*t 
+ ((1+s0)*(t)^2)/2) - delta; 
     solve_even = fsolve(f,1); 
     B_A = [B_A solve_even]; 
     m1B_Next = m1A_Current + (1+s0)*solve_even; 
     m2B_Next = (delta - c1*m1B_Next)/c2; 
     m1B_Current = m1B_Next; 
     m2B_Current = m2B_Next; 
     else %if k is odd/interval B_n to A_n+1 
     g = c1*(m1B_Current - (1-s0)*t) +c2(m2B_Current + m1B_Current*t - ((1-s0)*(t)^2)/2) + delta; 
     solve_odd = fsolve(g,1); 
     A_B = [A_B solve_odd] 
     m1A_Next = m1B_Current - (1-s0)*solve_odd; 
     m2A_Next = -(delta +c1*m1A_Next)/c2; 
     m1A_Current = m1A_Next; 
     m2A_Current = m2A_Next; 
     end 
    end 
end 

また、ひどい変数のラベリングについては、あらかじめご了承ください。

>> SecondOrderSimulation(1/2,1,1,1/2,0) 
Error using lsqfcnchk (line 108) 
If FUN is a MATLAB object, it must have an feval method. 

Error in fsolve (line 210) 
funfcn = lsqfcnchk(FUN,'fsolve',length(varargin),funValCheck,gradflag); 

Error in SecondOrderSimulation (line 11) 
     solve_even = fsolve(f,1); 

答えて

1

fsolveへの最初の引数はあなたがanonymous functionsとしてfgを書く必要がありますので、function handleなければならない:

f = @(t) c1*(m1A_Current + (1+s0)*t) +c2*(m2A_Current + m1A_Current*t ... 
     + ((1+s0)*(t)^2)/2) - delta; 

g = @(t) c1*(m1B_Current - (1-s0)*t) +c2(m2B_Current + m1B_Current*t ... 
     - ((1-s0)*(t)^2)/2) + delta; 
+0

あなたの先生は、それはすべてが動作するようになりました:)命の恩人ですありがとうございました!! – pepper

関連する問題