"Error using symengine Unable to convert expression into double array" when using solve function

1 view (last 30 days)
Hi,
I'm trying to set up a symbolic solver to help solve an equation I can't solve analytically. I need the output of the code in a usable format (double) so that I can use it in another equation. However, when I attempt to run the code, it throws the following error:
Error using symengine
Unable to convert expression into double array.
Error in sym/double (line 698)
Xstr = mupadmex('symobj::double', S.s, 0);
Error in script (line 8)
f_x(counter) = double(solve(eqn, x));
Does anyone have ideas for how to remedy this?
Code for reference:
%% Constants
g = 1.2; y = 0.1; counterlim = 50
while counter < counterlim
syms x
eqn = y == c * sqrt((x ^ (2 / g) - x ^ ((g + 1) / g)));
f_x(counter) = double(solve(eqn, x));
c = c + 0.01
counter = counter + 1;
end

Accepted Answer

Walter Roberson
Walter Roberson on 9 Oct 2020
%% Constants
C_v = 0.5;
A_o = 1;
P_upstream = 1;
MW = 0.004;
Z = 0.95;
R = 8.314;
T1 = 100;
gamma = 1.660;
mdot_desired = 0.1;
counterlim = 50;
f_Pratio = zeros(1,counterlim);
for counter = 1 : counterlim
syms Pratio
eqn = mdot_desired == C_v * A_o * P_upstream * sqrt((2 * MW / ...
(Z * R * T1)) * (gamma / (gamma - 1)) * (Pratio ^ (2 / gamma) - ...
Pratio ^ ((gamma + 1) / gamma)));
sol = vpasolve(eqn, Pratio);
f_Pratio(counter) = double(sol);
A_o = A_o + 0.01;
counter = counter + 1;
end
Note: the answers are all complex valued. In each case, the imaginary component is roughly 2*counter .
There are two solutions for each equation; the solutions are complex conjugates of each other.
  1 Comment
Walter Roberson
Walter Roberson on 13 Oct 2020
For the revised question, and selecting down to real values:
g = 1.2; y = 0.1; counterlim = 50;
c0 = 1; %CHECK THIS
delta_c = 0.01;
syms c x real
eqn = y == c * sqrt((x ^ (2 / g) - x ^ ((g + 1) / g)));
sol = solve(eqn, x, 'returnconditions', true);
cvals = c0 + (0:counterlim-1) * delta_c;
eqns = subs(sol.conditions, c, cvals);
fx_cell = arrayfun(@(eqn) double(subs(sol.x, sol.parameters, solve(eqn))).', eqns, 'uniform', 0);
fx = vertcat(fx_cell{:});
plot(cvals, fx)
There are two real solutions for each c value, at least in the range being worked over.
Note that your revised question did not initialize c, so I had to speculate that your c was taking the place of your A0 of your original question, which you had initialized to 1. If that is not correct, then adjust the c0 variable.

Sign in to comment.

More Answers (0)

Products


Release

R2020a

Community Treasure Hunt

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

Start Hunting!