Azzera filtri
Azzera filtri

Error: using fmincon: FMINCON requires all values returned by functions to be of data type double.

1 visualizzazione (ultimi 30 giorni)
I am using symbolic toolbox and fmincon for minimization. But when I am using d, r_g and G_g as symbolic variable I am getting an error. This is the error I am getting "FMINCON requires all values returned by functions to be of data type double."
[q] = optimizeParameters();% Call optimizeParameters to define the objective function q
options = optimset('PlotFcns', @optimplotfval);% Set optimization options
d0 = [-0.5, 24, 3e6];
lb = [-1, 24, 2e6];
ub = [0, 32, 6e6];
q(d0(1),d0(2),d0(3))
ans = 
NaN
%[solution, fval] = fmincon(@(x) q(x(1), x(2), x(3)), d0, [], [], [], [], lb, ub, [], options);
function q = optimizeParameters()
syms d r_g G_g%symbolic variables
theta = pi/4;
p = 2*pi;
Vs = 250;
k = p / Vs;
c = Vs / sin(theta);
w5 = 0.001;
n = 3;
dl = -6;
d1 = dl + 2 * n * d - d;
q = @(d, r_g, G_g) calculateObjective(theta, p, d, r_g, G_g, Vs, k, c, w5, n, dl, d1);
end
function answer = calculateObjective(theta, p, d, r_g, G_g, Vs, k, c, w5, n, dl, d1);
r_s= 2000;
G_s= 1.25e8;
n_s= 0.3;
l_s= 2*n_s*G_s/(1-2*n_s);
a_s= sqrt((l_s+2*G_s)/r_s);
b_s= sqrt(G_s/r_s);
g_a_s= sqrt((c/a_s)^2-1);
g_b_s= sqrt((c/b_s)^2-1);
theta_s= 2*(b_s/c)^2;
A_s= k*g_a_s*d;
B_s= k*g_b_s*d;
C_A_s= cos(A_s);
S_A_s= sin(A_s);
C_B_s= cos(B_s);
S_B_s= sin(B_s);
n_g= 0.17;
l_g= 2*n_g*G_g/(1-2*n_g);
a_g= sqrt((l_g+2*G_g)/r_g);
b_g= sqrt(G_g/r_g);
g_a_g= sqrt((c/a_g)^2-1);
g_b_g= sqrt((c/b_g)^2-1);
theta_g= 2*(b_g/c)^2;
A_g= k*g_a_g*d;
B_g= k*g_b_g*d;
C_A_g= cos(A_g);
S_A_g= sin(A_g);
C_B_g= cos(B_g);
S_B_g= sin(B_g);
Gs_inv = [theta_s*C_A_s+(1-theta_s)*C_B_s, 1i*(g_a_s*g_b_s*theta_s*S_B_s+(1-theta_s)*S_A_s)/g_a_s, (-C_A_s+C_B_s)/(c^2*r_s), 1i*(g_a_s*g_b_s*S_B_s+S_A_s)/(c^2*g_a_s*r_s);...
1i*(-g_a_s*g_b_s*theta_s*S_A_s+(1-theta_s)*S_B_s)/g_b_s, theta_s*C_B_s+(1-theta_s)*C_A_s, 1i*(g_a_s*g_b_s*S_A_s+S_B_s)/(c^2*g_b_s*r_s), (-C_A_s+C_B_s)/(c^2*r_s);...
c^2*r_s*theta_s*(theta_s-1)*(C_A_s-C_B_s), 1i*c^2*r_s*(g_a_s*g_b_s*theta_s^2*S_B_s-(theta_s-1)^2*S_A_s)/g_a_s, theta_s*C_B_s+(1-theta_s)*C_A_s, 1i*(g_a_s*g_b_s*theta_s*S_B_s+(theta_s-1)*S_A_s)/g_a_s;...
1i*c^2*r_s*(g_a_s*g_b_s*theta_s^2*S_A_s+(theta_s-1)^2*S_B_s)/g_b_s, c^2*r_s*theta_s*(theta_s-1)*(C_A_s-C_B_s), 1i*(-g_a_s*g_b_s*theta_s*S_A_s+(1-theta_s)*S_B_s)/g_b_s, theta_s*C_A_s+(1-theta_s)*C_B_s];
Gg_inv = [theta_g*C_A_g+(1-theta_g)*C_B_g, 1i*(g_a_g*g_b_g*theta_g*S_B_g+(1-theta_g)*S_A_g)/g_a_g, (-C_A_g+C_B_g)/(c^2*r_g), 1i*(g_a_g*g_b_g*S_B_g+S_A_g)/(c^2*g_a_g*r_g);...
1i*(-g_a_g*g_b_g*theta_g*S_A_g+(1-theta_g)*S_B_g)/g_b_g, theta_g*C_B_g+(1-theta_g)*C_A_g, 1i*(g_a_g*g_b_g*S_A_g+S_B_g)/(c^2*g_b_g*r_g), (-C_A_g+C_B_g)/(c^2*r_g);...
c^2*r_g*theta_g*(theta_g-1)*(C_A_g-C_B_g), 1i*c^2*r_g*(g_a_g*g_b_g*theta_g^2*S_B_g-(theta_g-1)^2*S_A_g)/g_a_g, theta_g*C_B_g+(1-theta_g)*C_A_g, 1i*(g_a_g*g_b_g*theta_g*S_B_g+(theta_g-1)*S_A_g)/g_a_g;...
1i*c^2*r_g*(g_a_g*g_b_g*theta_g^2*S_A_g+(theta_g-1)^2*S_B_g)/g_b_g, c^2*r_g*theta_g*(theta_g-1)*(C_A_g-C_B_g), 1i*(-g_a_g*g_b_g*theta_g*S_A_g+(1-theta_g)*S_B_g)/g_b_g, theta_g*C_A_g+(1-theta_g)*C_B_g];
A1= (Gg_inv*Gs_inv)*(Gg_inv*Gs_inv)*Gg_inv;
A_s0= k*g_a_s*dl;
B_s0= k*g_b_s*dl;
C_A_s0= cos(A_s0);
S_A_s0= sin(A_s0);
C_B_s0= cos(B_s0);
S_B_s0= sin(B_s0);
D= [-(a_s/c)^2*C_A_s0, 1i*(a_s/c)^2*S_A_s0, -theta_s*g_b_s*C_B_s0, 1i*theta_s*g_b_s*S_B_s0;...
-1i*(a_s/c)^2*g_a_s*S_A_s0, (a_s/c)^2*g_a_s*C_A_s0, 1i*theta_s*S_B_s0, -theta_s*C_B_s0;...
-r_s*a_s^2*(theta_s-1)*C_A_s0, 1i*r_s*a_s^2*(theta_s-1)*S_A_s0, -r_s*c^2*theta_s^2*g_b_s*C_B_s0, 1i*r_s*c^2*theta_s^2*g_b_s*S_B_s0;...
1i*r_s*a_s^2*theta_s*g_a_s*S_A_s0, -r_s*a_s^2*theta_s*g_a_s*C_A_s0, -1i*r_s*c^2*theta_s*(theta_s-1)*S_B_s0, r_s*c^2*theta_s*(theta_s-1)*C_B_s0];
D1= D(1,1);
D2= D(1,2);
D3= D(1,3);
D4= D(1,4);
D5= D(2,1);
D6= D(2,2);
D7= D(2,3);
D8= D(2,4);
D9= D(3,1);
D10= D(3,2);
D11= D(3,3);
D12= D(3,4);
D13= D(4,1);
D14= D(4,2);
D15= D(4,3);
D16= D(4,4);
a_bar= ((D10-D9)*(D8-D7)+(D5-D6)*(D12-D11))/((D2-D1)*(D8-D7)+(D4-D3)*(D5-D6));
b_bar= ((D9-D10)*(D4-D3)+(D2-D1)*(D12-D11))/((D2-D1)*(D8-D7)+(D4-D3)*(D5-D6));
c_bar= ((D14-D13)*(D8-D7)+(D16-D15)*(D5-D6))/((D2-D1)*(D8-D7)+(D4-D3)*(D5-D6));
d_bar= ((D13-D14)*(D4-D3)-(D16-D15)*(D1-D2))/((D2-D1)*(D8-D7)+(D4-D3)*(D5-D6));
A_s1= k*g_a_s*d1;
B_s1= k*g_b_s*d1;
C_A_s1= cos(A_s1);
S_A_s1= sin(A_s1);
C_B_s1= cos(B_s1);
S_B_s1= sin(B_s1);
D_l= [-(a_s/c)^2*C_A_s1, 1i*(a_s/c)^2*S_A_s1, -theta_s*g_b_s*C_B_s1, 1i*theta_s*g_b_s*S_B_s1;...
-1i*(a_s/c)^2*g_a_s*S_A_s1, (a_s/c)^2*g_a_s*C_A_s1, 1i*theta_s*S_B_s1, -theta_s*C_B_s1;...
-r_s*a_s^2*(theta_s-1)*C_A_s1, 1i*r_s*a_s^2*(theta_s-1)*S_A_s1, -r_s*c^2*theta_s^2*g_b_s*C_B_s1, 1i*r_s*c^2*theta_s^2*g_b_s*S_B_s1;...
1i*r_s*a_s^2*theta_s*g_a_s*S_A_s1, -r_s*a_s^2*theta_s*g_a_s*C_A_s1, -1i*r_s*c^2*theta_s*(theta_s-1)*S_B_s1, r_s*c^2*theta_s*(theta_s-1)*C_B_s1];
B= A1*D_l;
B1= B(1,1);
B2= B(1,2);
B3= B(1,3);
B4= B(1,4);
B5= B(2,1);
B6= B(2,2);
B7= B(2,3);
B8= B(2,4);
B9= B(3,1);
B10= B(3,2);
B11= B(3,3);
B12= B(3,4);
B13= B(4,1);
B14= B(4,2);
B15= B(4,3);
B16= B(4,4);
w_in= (D_l(2,4)-D_l(2,3))*c*w5;
mag_w_in= abs(w_in);
u_in= (D_l(1,4)-D_l(1,3))*c*w5;
mag_u_in= abs(u_in);
Input= sqrt(mag_u_in^2+mag_w_in^2);
c1= -(B1+B2);
c2= -(B3+B4);
c3= -(B5+B6);
c4= -(B7+B8);
c5= -(B9+B10);
c6= -(B11+B12);
c7= -(B13+B14);
c8= -(B15+B16);
x2_inv= [(-b_bar*c3*c8+b_bar*c4*c7+c3*c6*d_bar-c4*c5*d_bar+c5*c8-c6*c7)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7), (b_bar*c1*c8-b_bar*c2*c7-c1*c6*d_bar+c2*c3*d_bar)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7), (c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7), (-b_bar*c1*c4+b_bar*c2*c3+c1*c6-c2*c5)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7);...
(a_bar*c3*c8-a_bar*c4*c7-c3*c6*c_bar+c4*c5*c_bar)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7), (-a_bar*c1*c8+a_bar*c2*c7+c1*c6*c_bar-c2*c5*c_bar+c5*c8-c6*c7)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7), (-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7), (a_bar*c1*c4-a_bar*c2*c3+c3*c6-c4*c5)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7);...
(a_bar*c4*d_bar-a_bar*c8-b_bar*c4*c_bar+c6*c_bar)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7), (-a_bar*c2*d_bar+b_bar*c2*c_bar-b_bar*c8+c6*d_bar)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7), (-c2*c_bar+c4*d_bar+c8)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7), (a_bar*c2+b_bar*c4-c6)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7);...
(-a_bar*c3*d_bar+a_bar*c7+b_bar*c3*c_bar-c5*c_bar)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7), (a_bar*c1*d_bar-b_bar*c1*c_bar-b_bar*c7-c5*d_bar)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7), (c1*c_bar+c3*d_bar-c7)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7), (-a_bar*c1+b_bar*c3+c5)/(a_bar*(c1*c4*d_bar-c1*c8-c2*c3*d_bar+c2*c7)+b_bar*(-c1*c4*c_bar+c2*c3*c_bar-c3*c8+c4*c7)+c_bar*(c1*c6-c2*c5)+d_bar*(c3*c6-c4*c5)+c5*c8-c6*c7)];
Y2= x2_inv*(B*[0;0;-w5;w5]);
u_out1= c*abs(Y2(1,1));
w_out1= c*abs(Y2(2,1));
Output= sqrt(u_out1^2+w_out1^2);
answer= Output/Input;
end

Risposta accettata

Torsten
Torsten il 30 Apr 2024
Spostato: Torsten il 30 Apr 2024
As you can see above, your function returns a symbolic NaN, but it must return a numerical defined value.
To change the output to numeric, use
function q = optimizeParameters()
%syms d r_g G_g%symbolic variables
theta = pi/4;
p = 2*pi;
Vs = 250;
k = p / Vs;
c = Vs / sin(theta);
w5 = 0.001;
n = 3;
dl = -6;
d1 = @(d)dl + 2 * n * d - d;
q = @(d, r_g, G_g) calculateObjective(theta, p, d, r_g, G_g, Vs, k, c, w5, n, dl, d1(d));
end
To avoid NaN output, debug "calculateObjective".

Più risposte (0)

Prodotti


Release

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by