Why does solving my equation result in the message "No complex subexpressions allowed in real mode."?

조회 수: 4 (최근 30일)
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.

답변 (2개)

Torsten
Torsten 2023년 9월 12일
편집: Torsten 2023년 9월 12일
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
Torsten
Torsten 2023년 9월 13일
Why should there be real solutions for pw if eps_exp, eps_l and eps_w are complex ? Can you give an example ?
Goncalo Costa
Goncalo Costa 2023년 9월 13일
I have data from a measurement, , and I have a model that I am trying to fit in it, the model equation is .
I have quantities (which are attached above) for and I am trying to find which values of could make .
The way I thought of doing this was by basically equalling one to the other, as shown below, and try to get a the value for that will get me the subtraction closest to 0 (or exactly 0 if possible).
I believe that could be a real number, because it is solely a factor and all other terms on the left and right side of the equation are complex numbers.

댓글을 달려면 로그인하십시오.


Torsten
Torsten 2023년 9월 13일
편집: Torsten 2023년 9월 13일
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
pw = 0.0771
  댓글 수: 4
Goncalo Costa
Goncalo Costa 2023년 9월 13일
Oh, ok I have never used the least-squares, so is this what is happening when you calculate A and b?
Thanks once more.
Torsten
Torsten 2023년 9월 13일
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

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Formula Manipulation and Simplification에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by