2016-02-22 56 views
0

的漸變時採取了象徵性的函數的梯度,當我得到一個錯誤。誰能告訴我,爲什麼我得到這個錯誤?錯誤採取象徵性的功能

syms x1 x2 R 

L0=0; %[m] 
k1=8; %[N/m] 
k2=4; %[N/m] 
F1=5; %[N] 
F2=10; %[N] 

F = 0.5*k1*(sqrt(x1^2 + (L0-x2)^2) - L0)^2 + 0.5*k2*(sqrt(x1^2 + (L0+x2)^2) 
    - L0)^2 - F1*x1 - F2*x2; 
f = matlabFunction(F); 

R = 0.1; 
GI = x1^2 + x2^2 - R^2; 
gi = matlabFunction(GI); 

epsilon=0.001; 

xo=[0,0]'; 
k = 0; 
r = (sqrt(5)-1)/2; 
rpe=0.01; 

Merit_pe = @(x1,x2) f(x1,x2) + rpe*(max(0,gi(x1,x2)))^2; 

g = gradient(Merit_pe, [x1 x2]); 

錯誤:

Error using sym/max (line 97) 

Input arguments must be convertible to 
floating-point numbers. 

Error in 
Ex>@(x1,x2)f(x1,x2)+rpe*(max(0,gi(x1,x2)))^2 

Error in sym>funchandle2ref (line 1249) 
    S = x(S{:}); 

Error in sym>tomupad (line 1154) 
    x = funchandle2ref(x); 

Error in sym (line 163) 
       S.s = tomupad(x); 

Error in sym/gradient (line 17) 
args = privResolveArgs(sym(f)); 

Error in Ex (line 31) 
g = gradient(Merit_pe, [x1 x2]) 

我覺得最大的部分是造成我的麻煩,但我仍然需要確定這個函數的梯度。有任何建議嗎? (我可以用手我想這樣做,但我寧願沒有,如果我沒有)

+0

你可以替換'MAX(0,x)的'由'X * (X> 0)'。然後,我仍然得到一些MuPAD錯誤,但也許這樣的想法可以幫助你... – hbaderts

回答

1

直接服用max(0,gi(x1,x2))梯度是不可能的MATLAB。取而代之的是功能應根據following definition定義。

功能Merit_pe如下然後可以定義:

if gi(xo(1,1),xo(2,1)) > 0 
    Merit_pe = @(x1,x2) f(x1,x2) + rpe*(gi(x1,x2))^2; 
else 
    Merit_pe = @(x1,x2) f(x1,x2); 
end 

然後可以使用來確定梯度:

g = gradient(Merit_pe, [x1 x2]);