2015-11-14 68 views
0

我想爲每個x值設置一個約束,0 < = f(x,vctr)< = 100。其結果是:使用fmincon進行功能受限優化(在Matlab中)?

???由於功能約束「cnstrnt」,未定義的函數或變量「x」。

雖然它是一個變量,fmincon要求在cnstrnt一個的x值。 x代表多個變量。 b,kvctr(常數矢量)是常數。對約束進行編碼的正確方法是什麼?

function [ h ] = f(x,vctr) 

[email protected](x) (vctr(1,6).*x.^5+vctr(1,5).*x.^4+vctr(1,4).*x.^3+ ... 
vctr(1,3).*x.^2+vctr(1,2).*x.^1+vctr(1,1)); 
h=fzero(@(x)(g(x)-y),0); 
end 

function [ cc,ceq ] = cnstrnt(x,b,vctr) 

for k=1:length(b)*2 

     cc(k)=f(x(k),vctr)-100; 
     cc(k+1)=-f(x(k),vctr); 
end 

ceq=[]; 

end 


[result,FVAL,EXITFLAG,OUTPUT,LAMBDA,GRAD,HESSIAN]= fmincon(@(x)obj(x,b,c,L,vctr) ,x0,A,B,Aeq,beq,[],ub,cnstrnt(x,b,vctr),opts); 

??? Undefined function or variable 'x'. 
+0

函數'cnstrnt'中的'f'是什麼?它在哪裏定義? – horchler

+0

f是一個多項式函數(但線性給定x),它依賴於變量x和常量vctr。每個x的值都被評估w.r.t函數f以匹配指定的條件。 – Dirk

+0

如果你在整個顯示'cnstrnt',那麼我不會看到函數如何訪問'f'。 f定義在哪裏? – horchler

回答

1

變量必須聲明爲@(x)@(x)cnstrnt(x,b,vctr)。然後fmincon可以識別變量並與常數區分開來。

[result,FVAL,EXITFLAG,OUTPUT,LAMBDA,GRAD,HESSIAN]= fmincon(@(x)obj(x,b,c,L,vctr) ,x0,A,B,Aeq,beq,[],ub,@(x)cnstrnt(x,b,vctr),opts); 
+0

只需添加它,但不要貢獻! – Dirk