How to convert symbolic expression to numeric?
Afficher commentaires plus anciens
I am creating a distance function that I will need for convex optimization later. This distance function requires integrating a function of x, x', z, and z' so I am initially dealing with symbolic expressions. The code below produces the desired integrand as its ouput. However, I cannot seem to convert this 1x1 sym output into anything that I use numerically. double, matlabFunction, and sym2poly all just give errors. As a workaround, I've just manually transcriped the resulting formula but that is obviously not an ideal solution. What am I doing wrong here?
syms x y z k_1 k_2 k_3 k_4 k_5 k_6 k_7 k_8 y_0
x = k_1*(y^3) + k_2*(y^2) + k_3*y+k_4;
xprime = 3*k_1*(y^2) + 2*k_2*y + k_3;
% construction of approximate trajectory for z
z = k_5*(x^3) + k_6*(x^2) + k_7*x+k_8;
zprime = 3*k_5*(x^2) + 2*k_6*x + k_7;
integrand = sqrt(1+(zprime*xprime)^2+(xprime)^2);
% performance parameters
Isp = 300; % s
S = 12.56; % m^2
P_min = 540; % kN
P_max = 800; % kN
alpha_min = -10; % degrees
alpha_max = 10; % degrees
beta_min = -10; % degrees
beta_max = 10; % degrees
T_c = 0.7; % s
delta_T = 3; % s
maxdelta_P = 80; % kN
N = 200;
kappa = 0.5;
deltaT_L = 1.5; % s
V_0 = 335; % m/s
theta_0 = -65; % degrees
phi_0 = -6; % degrees
x_0 = 2500; % m
y_0 = 3698; % m
z_0 = 2500; % m
m_0 = 31200; % kg
% target terminal states
V_f = 0; % m/s
theta_f = -90; % degrees
phi_f = 0; % degrees
x_f = 3232; % m
y_f = 0; % m
z_f = 2646; % m
Ax = [(y_0)^3 (y_0)^2 y_0 1;...
(y_f)^3 (y_f)^2 y_f 1;...
3*(y_0)^2 2*(y_0) 1 0;...
3*(y_f)^2 2*(y_f) 1 0];
bx = [x_0; x_f; cos(phi_0)/tan(theta_0); cos(phi_f)/tan(theta_f)];
kx = Ax\bx;
k_1 = kx(1); k_2 = kx(2); k_3 = kx(3); k_4 = kx(4);
% construction of approximate trajectory for z
Az = [(x_0)^3 (x_0)^2 y_0 1;...
(x_f)^3 (x_f)^2 x_f 1;...
3*(x_0)^2 2*x_0 1 0;...
3*(x_f)^2 2*x_f 1 0];
bz = [z_0; z_f; -tan(phi_0); -tan(phi_f)];
kz = Az\bz;
k_5 = kz(1); k_6 = kz(2); k_7 = kz(3); k_8 = kz(4);
integrand_num = matlabFunction(subs(simplify(integrand)))
%simplify(subs(integrand))

Réponses (1)
integrand_num = matlabFunction(subs(simplify(integrand)))
gives you a function handle with y as input argument (see above).
And this doesn't work in your MATLAB release ? Or do you use Octave ?
Catégories
En savoir plus sur Programming dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!