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 Center および File ExchangeFormula Manipulation and Simplification についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by