Error using barrier Finite difference derivatives at initial point contain Inf or NaN values. Fmincon cannot continue.
6 views (last 30 days)
Show older comments
I am trying to solve optimization problem with constraints.
I need to find those values of variable 'u' at which the 'costfunctionalone' reachs a minimum.
I am using the fmincon function for that.
Unfortinetly, I get the error (Error using barrier Finite difference derivatives at initial point contain Inf or NaN values. Fmincon cannot continue) when starting the program.
What is the cose of that error? And how can I correct it?
clear all ;clc; close all;
%establish the prediction horizon "T", time step "tsample" and Number of simulation steps:
T= 0.6860;
tsample=T/10;
Nsim=1200;
Nfinal=tsample*Nsim;
%establish the weight matrixes:
Q=100;
Qx=1000000; Qy=100; Qz=100;
R=1;
T1=0.275;
T2=0.025;
A=[0 1;-1/T2 -T1/T2];
B=[0 1];
%establish the initial control unputs guesses:
u0=[1; 2; 3; 4; 5; 6; 7; 8; 9; 10 ]';
q0 = [pi/3 20];
q4_save=zeros(1,Nsim);
v4_save=zeros(1,Nsim);
u4_save=zeros(1,Nsim);
t_save=zeros(1,Nsim);
Mmax=310;
I=0.3;
for t=0:tsample:Nfinal
i=round(t/tsample+1);
tspan = [tsample*(i-1) tsample*(i-1)+T];
prov=0;
p=0;
for t1=t:tsample:t+9*tsample
f = @(u)costfunctionalone(t1,T,Qx,R,u,tsample,q0,A,B,tspan,i);
%find optimal inputs "u", minimizimg the functional "J":
options = optimoptions(@lsqnonlin,'Algorithm','levenberg-marquardt',...
'MaxFunctionEvaluations',1500)
[u,fval,exitflag,output,lambda,grad,hessian]=fmincon(f,u0,[],[],[],[],[-Mmax/I],[Mmax/I],@confunone,options)
u0=u;
p=prov;
end
%%
function J = costfunctionalone(t1,T,Qx,R,u,tsample,q0,A,B,tspan,i)
T1=0.275; T2=0.025;
if ((t1 >=0+(i-1)*tsample)&&(t1 < tsample+(i-1)*tsample))
u=u(:,1);
prov=1;
elseif ((t1 >=tsample+(i-1)*tsample)&&(t1 < 2*tsample+(i-1)*tsample))
u=u(:,2);
prov=2;
elseif ((t1 >=2*tsample+(i-1)*tsample)&&(t1 < 3*tsample+(i-1)*tsample))
u=u(:,3);
prov=3;
elseif ((t1 >=3*tsample+(i-1)*tsample)&&(t1 < 4*tsample+(i-1)*tsample))
u=u(:,4);
prov=4;
elseif ((t1 >=4*tsample+(i-1)*tsample)&&(t1 < 5*tsample+(i-1)*tsample))
u=u(:,5);
prov=5;
elseif ((t1 >=5*tsample+(i-1)*tsample)&&(t1 < 6*tsample+(i-1)*tsample))
u=u(:,6);
prov=6;
elseif ((t1 >=6*tsample+(i-1)*tsample)&&(t1 < 7*tsample+(i-1)*tsample))
u=u(:,7);
prov=7;
elseif ((t1 >=7*tsample+(i-1)*tsample)&&(t1 < 8*tsample+(i-1)*tsample))
u=u(:,8);
prov=8;
elseif ((t1 >=8*tsample+(i-1)*tsample)&&( t1 < 9*tsample+(i-1)*tsample))
u=u(:,9);
prov=9;
elseif ((t1 >=9*tsample+(i-1)*tsample )&&( t1 <= 10*tsample+(i-1)*tsample) )
u=u(:,10);
prov=10;
end
%%
b=0.275;
a=0.025;
sq=(-4*a+b^2)^0.5;
k=@(t1)t1/(2*a);
CC3=@(u)-u*( b+sq )/(2*sq);
CC4=@(u)-CC3(u)-u;
C1=@(t1,u)CC3(u)*exp( k(t1)*(-b+sq) );
C2=@(t1,u)CC4(u)*exp( k(t1)*(-b-sq) );
eq=@(t1,u)C1(t1,u)+C2(t1,u)+5-pi/2;
CF=@(t1,u)(eq(t1,u)'*Qx*eq(t1,u) + u'*R*u);
J=integral(@(t1)CF(t1,u),0,T,'ArrayValued',true);
1 Comment
Walter Roberson
on 7 Jun 2019
Your line
function J = costfunctionalone(t1,T,Qx,R,u,tsample,q0,A,B,tspan,i)
is inside
for t=0:tsample:Nfinal
Your code will not run at all.
Answers (0)
See Also
Categories
Find more on Linear Programming and Mixed-Integer Linear Programming in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!