how to use solve() without a 'z' variable solution

Hi, i'm trying to code a 'hn' and 'hc' solver, it uses those equations and data, but
close all
clear all
clc
%DATA
alfa = degtorad(30);, b = 0.14;, L = b;, m = L*sin(alfa);,k = L*sin(alfa);, pendiente = 0.001;,q = 4;, n = 0.011;
%FUNCTIONS
syms h
d = @(h) b+h.*(m+k);
a = @(h) b.*h+(h.^2)*(m+k)./2;
pm = @(h) b+h.*(sqrt(1+m)+sqrt(1+k));
eta = @(h) h.*(b+h*(m+k)+2*b)./(3*(b+h*(m+k)+b));
fr = @(h) (((q.^2).*d(h))./9.8.*a(h).^3).^0.5;
man = @(h) q.*n./(pendiente.^0.5) == (a(h).^(5/3))./(pm(h).^(2/3));
%SOLUTIONS
rug = eta(h);
hn = solve(man(h),h) %%%%HERE IS MY PROBLEM
hc = solve(fr(h).^2==1,h,) %%%%%HERE IS MY PROBLEM
Ec = hc + (q.^2)/((a(hc).^2)*2*9.8)
En = hn + (q.^2)/((a(hn).^2)*2*9.8)
And when I run it, matlab show me this:
Warning: Unable to solve symbolically. Returning a numeric solution using vpasolve.
> In sym/solve (line 304)
In calculos (line 15)
hn =
5.992149502432489941281916778964
hc =
root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1)
root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 2)
root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 3)
root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 4)
root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 5)
root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 6)
root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 7)
Warning: Solution is not unique because the system is rank-deficient.
> In symengine
In sym/privBinaryOp (line 1030)
In / (line 373)
In calculos (line 17)
Ec =
[ root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1) + 400000/(2401*(root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1)^2 + 2*root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1))^2), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1)]
[ root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 2) + 400000/(2401*(root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1)^2 + 2*root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1))^2), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 2), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 2), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 2), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 2), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 2), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 2)]
[ root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 3) + 400000/(2401*(root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1)^2 + 2*root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1))^2), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 3), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 3), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 3), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 3), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 3), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 3)]
[ root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 4) + 400000/(2401*(root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1)^2 + 2*root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1))^2), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 4), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 4), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 4), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 4), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 4), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 4)]
[ root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 5) + 400000/(2401*(root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1)^2 + 2*root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1))^2), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 5), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 5), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 5), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 5), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 5), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 5)]
[ root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 6) + 400000/(2401*(root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1)^2 + 2*root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1))^2), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 6), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 6), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 6), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 6), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 6), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 6)]
[ root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 7) + 400000/(2401*(root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1)^2 + 2*root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 1))^2), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 7), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 7), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 7), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 7), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 7), root(z^7 + 7*z^6 + 18*z^5 + 20*z^4 + 8*z^3 - 625000/49, z, 7)]
En =
6.0647894215630416283421290892246
>>
so what I want is to get a real number 'hc' without a 'z' variable on them, I think it could be because there are no real solutions but I'm not sure, don't know how to solve that problem, don't even know what it means

 Accepted Answer

The following gives real results.
%DATA
alfa = deg2rad(30); b = 0.14; L = b; m = L*sin(alfa); k = L*sin(alfa); pendiente = 0.001; q = 4; n = 0.011;
%FUNCTIONS
%syms h
d = @(h) b+h.*(m+k);
a = @(h) b.*h+(h.^2)*(m+k)./2;
pm = @(h) b+h.*(sqrt(1+m)+sqrt(1+k));
eta = @(h) h.*(b+h*(m+k)+2*b)./(3*(b+h*(m+k)+b));
fr = @(h) (((q.^2).*d(h))./9.8.*a(h).^3).^0.5;
fr2 = @(h) (((q.^2).*d(h))./9.8.*a(h).^3) - 1;
man = @(h) q.*n./(pendiente.^0.5) - (a(h).^(5/3))./(pm(h).^(2/3));
%SOLUTIONS
hn = fzero(man, [0 10])
hc = fzero(fr2, [0 10])
rug = eta(hn) % not sure if this is what is wanted for rug
Ec = hc + (q.^2)/((a(hc).^2)*2*9.8)
En = hn + (q.^2)/((a(hn).^2)*2*9.8)

5 Comments

Thanks, it is a huge help, but doesn't work with 'fr' function because I mispelled it (sorry), is that one:
fr = @(h) (((q.^2).*d(h))./(9.8.*a(h).^3).^0.5;
so if we equal to zero, it should be:
fr = @(h) (((q.^2).*d(h))./(9.8.*a(h).^3)-1;
and that equation doesn't work with fzero function, matlab returns an error
That is exactly the function I called fr2 and it works with fzero! It returns a value of hc = 2.9695.
I suggest you plot your functions to see where the real roots are likely to lie. I used a range for h of 0 to 10, and the quick plotting I did seemed to suggest that was the range within which the roots lie. However, I didn't do a more detailed look.
Isn't the same
fr = @(h) (((q.^2).*d(h))./9.8.*a(h).^3).^0.5; %%wrong function
fr = @(h) (((q.^2).*d(h))./(9.8.*a(h).^3).^0.5; %%correct function
that parenthesis in 9.8 changes the function, that's why your code don't give me the correct solution and when I change it to the right way, the fzeros function don't work
thanks for all your help, going to plot it rn
You are right! But then you only need to change the search range slightly:
%DATA
alfa = deg2rad(30); b = 0.14; L = b; m = L*sin(alfa); k = L*sin(alfa); pendiente = 0.001; q = 4; n = 0.011;
%FUNCTIONS
%syms h
d = @(h) b+h.*(m+k);
a = @(h) b.*h+(h.^2)*(m+k)./2;
pm = @(h) b+h.*(sqrt(1+m)+sqrt(1+k));
eta = @(h) h.*(b+h*(m+k)+2*b)./(3*(b+h*(m+k)+b));
fr = @(h) ((q.^2).*d(h))./(9.8.*a(h).^3).^0.5;
fr2 = @(h) ((q.^2).*d(h))./(9.8.*a(h).^3) - 1;
man = @(h) q.*n./(pendiente.^0.5) - (a(h).^(5/3))./(pm(h).^(2/3));
%SOLUTIONS
hn = fzero(man, [0 10])
hc = fzero(fr2, [1 10])
rug = eta(hn) % not sure if this is what is wanted for rug
Ec = hc + (q.^2)/((a(hc).^2)*2*9.8)
En = hn + (q.^2)/((a(hn).^2)*2*9.8)

Sign in to comment.

More Answers (1)

R = @(v) sym(v);
%DATA
alfa = R(deg2rad(30));
b = R(0.14);
L = b;
m = L*sin(alfa);
k = L*sin(alfa);
pendiente = R(0.001);
q = R(4);
n = R(0.011);
%FUNCTIONS
syms h
d = b+h.*(m+k);
g = R(9.81);
a = b.*h+(h.^R(2))*(m+k)./R(2);
pm = b+h.*(sqrt(1+m)+sqrt(1+k));
eta = h.*(b+h*(m+k)+R(2)*b)./(R(3)*(b+h*(m+k)+b));
fr = sqrt(((q.^R(2)).*d)./g.*a.^R(3));
man = q.*n./sqrt(pendiente) == (a.^(R(5)/R(3)))./(pm.^(R(2)/R(3)));
%SOLUTIONS
rug = eta;
hn = solve(man,h);
display(hn)
hc = solve(fr.^R(2)==R(1), h);
display(hc)
fprintf('hc has %d total solutions\n', length(hc));
hcr = hc;
hcr(imag(hcr)~=0) = [];
fprintf('hc has %d real-valued solutions\n', length(hcr));
if isempty(hcr)
fprintf('No real solutions for hc. Giving up\n');
else
Ec = hcr + (q.^R(2))/((subs(a,h,hcr).^R(2))*R(2)*g);
display(Ec)
En = hn + (q.^R(2))/((subs(a,h,hn).^R(2))*R(2)*g);
display(En)
end

Products

Release

R2020a

Asked:

on 23 Jul 2020

Commented:

on 24 Jul 2020

Community Treasure Hunt

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

Start Hunting!