2017-07-25 138 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必须是一个function handle,所以你应该写fganonymous functions:现在

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