How to get fzero to work on an array?
34 次查看(过去 30 天)
显示 更早的评论
I'm trying to solve fzero for each value of x in an array, and I get theis error:
Operands to the || and && operators must be convertible to logical scalar values.
Error in fzero (line 444)
while fb ~= 0 && a ~= b
Error in hw5_code (line 14)
mach = fzero(eqn,[.16 2]);
x = .2:.1:.6;
r = .3 + 3.*((x-.5).^2);
g = 1.4;
p0 = 7576;
t0 = 1033;
pb = 100;
a = pi.*r.^2;
a_star = pi.*(.3^2);
eqn = @(m) (a./a_star).^2 - (1./m.^2 .*((2./(g+1)) .* (1 + (((g-1)./2) .* m.^2))).^((g+1)./(g-1)));
mach = fzero(eqn,[.16 2]);
t = t0 .* ((1+ (((g-1)/2) .* mach.^2)).^-1);
p = p0 .* (1+ (((g-1)/2) .* mach.^2)).^-(g/(g-1));
rho = p./(287.*t);
air = sqrt(g.*287.*t);
v = mach.*air;
m_dot = rho .* v .* a;
a1 = 1 + ((2.*g)./(1+g)).*((mach.^2) -1);
a2 = (2 + (g-1).*(mach.^2))./((g+1).*(mach.^2));
change_entropy = log(a1.*a2) - (((g-1)/g).*log(a1));
3 个评论
Star Strider
2020-5-24
A (1x2) vector is entirely appropriate, providing a sign change exists on the interval.
Stephen23
2020-5-24
编辑:Stephen23
2020-5-24
"Why are you passing a 1x2 vector as an initial guess to fzero()?"
The fzero documentation states that x0 may be scalar or a 2-element vector, in which case "fzero checks that fun(x0(1)) and fun(x0(2)) have opposite signs, and errors if they do not. It then iteratively shrinks the interval where fun changes sign to reach a solution." This is clearly very useful when the bracketing range is known.
回答(2 个)
Alan Weiss
2020-5-26
I don't know if this is what you wanted, but I got it to work by making a loop for fzero:
x = .2:.1:.6;
r = .3 + 3.*((x-.5).^2);
g = 1.4;
p0 = 7576;
t0 = 1033;
pb = 100;
a = pi.*r.^2;
a_star = pi.*(.3^2);
eqn = @(m) (a./a_star).^2 - (1./m.^2 .*((2./(g+1)) .* (1 + (((g-1)./2) .* m.^2))).^((g+1)./(g-1)));
%%
% mach = fzero(eqn,[.16 2]);
mach = zeros(size(eqn(.16)));
for i = 1:length(mach)
tp = zeros(size(mach));
tp(i) = 1;
mach(i) = fzero(@(x)dot(tp,eqn(x)),[0.15 1]);
end
%%
t = t0 .* ((1+ (((g-1)/2) .* mach.^2)).^-1);
p = p0 .* (1+ (((g-1)/2) .* mach.^2)).^-(g/(g-1));
rho = p./(287.*t);
air = sqrt(g.*287.*t);
v = mach.*air;
m_dot = rho .* v .* a;
a1 = 1 + ((2.*g)./(1+g)).*((mach.^2) -1);
a2 = (2 + (g-1).*(mach.^2))./((g+1).*(mach.^2));
change_entropy = log(a1.*a2) - (((g-1)/g).*log(a1));
Alan Weiss
MATLAB mathematical toolbox documentation
2 个评论
Nabilla Dewi Septiani
2021-12-8
Hello sir, I have similar problem with this, but in my case I have 2 variables that are in array. I have tried using the same code, but I got this error
Error using fzero (line 274)
Function values at the interval endpoints must differ in sign.
Error in Term_Paper (line 14)
x(i)=fzero(@(y)dot(tp,fx(x)),[0.15 1]);
Anyone can give a solution? Please
clear all; close all; clc;
%Parameters
xin=0.2; xout=0.1; Pr=0.3; qf=1;
y=0:0.1:1;
alpha=0:100:1000;
%For Cross-Flow Module (CF)
%y=(1+(x+Pr).*(alpha-1))-((1+(x+Pr).*(alpha-1)).^2-(4.*alpha.*(alpha-1).*x.*Pr)).^0.5/(2.*Pr.*(alpha-1))
%Calculating x
fx=@(x) ((1+((x+Pr).*(alpha-1))-((((1+((x+Pr).*(alpha-1))).^2)-(4.*alpha.*(alpha-1).*x.*Pr)).^0.5))/(2.*Pr.*(alpha-1)))-y;
x=zeros(size(fx(0.16)));
for i=1:length(x)
tp=zeros(size(x));
tp(i)=1;
x(i)=fzero(@(y)dot(tp,fx(x)),[0.15 1]);
end
%qfout-qf=-(1-Pr+((alpha-1).*(x-Pr.*y)))*a
%x-xin=(-(1/qf).*(alpha.*(x-(Pr.*y))*a)+(-x.*ln(qfout/qf))
syms a qfout
E=(-(1-Pr+((alpha-1).*(x-Pr.*y)))*a)-qfout+qf==0 , (-(1/qf).*alpha.*(x-(Pr.*y))*a)+(-x.*log(qfout/qf))-x+xin==0;
S=solve(E,a,qfout)
plot(double(alpha),double(E))
xlabel('Selectivity, alpha'); ylabel('Dimensionless Total Membrane Area, a_T');
Alan Weiss
2021-12-8
I suggest that you use the debugger and put a break point before the loop that contains the fzero call. Check to see whether the function values have different signs at the interval endpoints. Adjust your code so that they always do.
Alan Weiss
MATLAB mathematical toolbox documentation
Walter Roberson
2021-12-8
I'm trying to solve fzero for each value of x in an array, and I get theis error:
Don't Do That.
fzero() is defined as only accepting scalar equations of one variable. It cannot in itself be used to solve at multiple x values simultaneously
You need to loop through the different x values, constructing the other values such as a or r as you go.
If you make a and r into functions of the current x value, then you can probably arrayfun() the fzero() call.
0 个评论
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!