Why does solving my equation result in the message "No complex subexpressions allowed in real mode."?
4 views (last 30 days)
Show older comments
I have an equation with a bunch of complex values in it, and with a variable in it that experimentally must be a real number. I am trying to find this real variable, p_w.
The code is as follows:
%loading the constants
eps_w = load('eps_w.mat');
eps_w = eps_w.eps_w; %complex number
eps_l = load('eps_lat.mat');
eps_l = eps_l.eps_lat; %complex number
eps_exp = load('eps_exp.mat');
eps_exp = eps_exp.refind_eps; %row of 225 complex numbers
%I am trying to solve the equation below and I know that p_w is real and
%equal or greater than 0.
for x = 1:length(eps_exp)
clear p_w
syms p_w
equation = eps_exp(x) - (p_w.*eps_w.^(1.3) + (1-p_w).*eps_l.^(1/3)).^3 == 0 ;
assume(p_w > 0)
p_water(x,:)= solve(equation, p_w, 'Real' , true)
end
Whenever I run this I get the following message:
"Error using mupadengine/feval (line 195): No complex subexpressions allowed in real mode.
Error in solve (line 293) : sol = eng.feval('solve', eqns, vars, solveOptions);
Error in (...) (line 20): p_water(x,:)= solve(equation, p_w, 'Real', true)"
Does this simply mean that there are no possible real solutions to the equation? From my pov there should be, as can be seen from the easier-to-read version of the equation, below. All epsilon values are complex, so there should be a value for p_w using real numbers.
If I am correct, then why am I getting the error message?
Previous attempts:
I have tried to simply manipulate the equation, as shown in one of the answers below, but I only get complex values when I do so.
0 Comments
Answers (2)
Torsten
on 12 Sep 2023
Edited: Torsten
on 12 Sep 2023
Why don't you simply solve for pw ?
pw = (eps_exp^(1/3) - eps_l^(1/3))/(eps_w^(1/3)-eps_l^(1/3))
Note that you use eps_w^(1.3) in your code, not eps_w^(1/3).
3 Comments
Torsten
on 13 Sep 2023
Why should there be real solutions for pw if eps_exp, eps_l and eps_w are complex ? Can you give an example ?
Torsten
on 13 Sep 2023
Edited: Torsten
on 13 Sep 2023
Next time, please report the real problem right at the beginning.
%loading the constants
eps_w = load('eps_w.mat');
eps_w = eps_w.eps_w; %complex number
eps_l = load('eps_lat.mat');
eps_l = eps_l.eps_lat; %complex number
eps_exp = load('eps_exp.mat');
eps_exp = eps_exp.refind_eps; %row of 225 complex numbers
eps_exp = eps_exp.';
A = [real(eps_w.^(1/3)-eps_l.^(1/3))*ones(size(eps_exp));imag(eps_w.^(1/3)-eps_l.^(1/3))*ones(size(eps_exp))];
b = [real(eps_exp.^(1/3)-eps_l.^(1/3));imag(eps_exp.^(1/3)-eps_l.^(1/3))];
pw = A\b
4 Comments
Torsten
on 13 Sep 2023
pw - determined as A\b - minimizes the expression
sum_{i=1}^{i=225} (pw*real(eps_w.^(1/3)-eps_l.^(1/3))-real(eps_exp(i).^(1/3)-eps_l.^(1/3)))^2 +
sum_{i=1}^{i=225} (pw*imag(eps_w.^(1/3)-eps_l.^(1/3))-imag(eps_exp(i).^(1/3)-eps_l.^(1/3)))^2
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!