Why am I receiving Not enough input arguments?

19 visualizzazioni (ultimi 30 giorni)
hello, I am working on an assignment where I need to find the pressure difference for 9 different states. Everything goes fine until i reach the turbulent flow section, where I can not figure out what to do. Any help would be appreciated. I have posted the three codes and the error towards the bottom
% P1 driver
clear
clc
p = 680;
u = 2.92*10^-4;
d = .01;
L = 2;
M = zeros(3,3);
% V1 E1
e = 0;
V = 0.05;
[f,flow, P] = fandp(V, d, L, e, p, u);
P1 = P;
M(1,1) = P1;
% V1 E2
e = 0.00015;
V = 0.05;
[f,flow, P] = fandp(V, d, L, e, p, u);
P2 = P;
M(1,2) = P2;
% V1 E3
e = 0.002;
V = 0.05;
[f,flow, P] = fandp(V, d, L, e, p, u);
P3 = P;
M(1,3) = P3;
% V2 E1
e = 0;
V = 0.1;
[f,flow, P] = fandp(V, d, L, e, p, u);
M(2,1) = P;
% V2 E2
e = 0.00015;
V = 0.1;
[f,flow, P] = fandp(V, d, L, e, p, u);
M(2,2) = P;
% V2 E3
e = 0.002;
V = 0.1;
[f,flow, P] = fandp(V, d, L, e, p, u);
M(2,3) = P;
% V3 E1
e = 0;
V = 0.5;
[f,flow, P] = fandp(V, d, L, e, p, u);
M(3,1) = P;
% V3 E2
e = 0.00015;
V = 0.5;
[f,flow, P] = fandp(V, d, L, e, p, u);
M(3,2) = P;
% V3 E3
e = 0.002;
V = 0.5;
[f,flow, P] = fandp(V, d, L, e, p, u);
M(3,3) = P;
here is the called function fandp:
function [f,flow, P] = fandp(V, d, L, e, p, u)
%flow_type Determines if flow is laminar, in transition, or turbulent
% V = velocity (m/s)
% d = diameter of pipe (m)
% L = length of pipe (m)
% e = roughness of pipe (m)
% p = density of fluid (kg/m^3)
% u = dynamic viscosity of fluid (Pa*s)
% flow = laminar, transition, or turbulent
% pressure = pressure difference required for desired flow
Re = 0;
P = 0;
%setup variables
xMin= -0.3;
xMax= 0.3;
tol=10^-8;
% gravity
g = 9.81;
%Calculate Reynolds Number
Re = (p*V*d)/u;
%Determine Flow Type
if Re < 2000
flow = 'laminar';
elseif Re > 3000
flow = 'turbulent';
elseif Re > 2000 && Re < 3000
flow = 'transition';
end
% f
if strcmp(flow, 'laminar')
f = (64/Re);
elseif strcmp(flow, 'turbulent')
[x_r] = bisect(@func,xMin,xMax,tol);
f = x_r;
elseif strcmp(flow, 'transition')
f = NaN;
end
check = isnan(f);
if check == 1
P = NaN;
else
% h
h = f*(L/d)*((V^2)/(2*g));
% P
P = p*g*h;
end
end
% Testing Function
function [f]=func(x,e,d,p,V,u)
f = -2*log((e/d)/3.7+(2.51/(p*V*d/u)*x^(1/2)))-(1/x^(1/2));
end
and here is the bisection function:
function [x_r,err,iter] = bisect(func,xMin,xMax,tol)
%This program will use the bisection method to find the roots to
%a function
%INPUTS:
%func is the function you want to find roots to
%xMin is the low range to begin the search
%xMax is the high value to search within
%tol is the acceptable error. The smaller the tol, the more
%iterations required. Recommended value is 1e-8
%OUTPUTS:
%x_r is the root to func
%err is the relative error of x_r, as measured by X-tol
a=func(xMin);
b=func(xMax);
if a*b>0
disp('Error: ends must evaluate to opposite signs');
return
end
iter=0;
x_Last=xMin;
err=abs(xMax-xMin);
iters = [];
roots = [];
errs =[];
while err>tol && iter<50
iter=iter+1;
iters = [iters,iter];
x_r =(xMax+xMin)/2;
c=func(x_r);
if a*c>0
xMin=x_r;
a=c;
elseif a*c<0
xMax=x_r;
b=c;
else
return;
end
if abs(x_r)>1
err=abs((x_r-x_Last)/x_r);
else
err=abs(x_r-x_Last);
end
x_Last=x_r;
roots =[roots,x_r];
errs =[errs,err];
end
%this renames the arrays to the name they are supposed
%to be according to the Lab03 .docx
x_r = roots;
err = errs;
iter = iters;
end
here is the error i am getting:
Not enough input arguments.
Error in fandp>func (line 61)
f = -2*log((e/d)/3.7+(2.51/(p*V*d/u)*x^(1/2)))-(1/x^(1/2));
Error in bisect (line 13)
a=func(xMin);
Error in fandp (line 40)
[x_r] = bisect(@func,xMin,xMax,tol);
Error in P1driver (line 56)
[f,flow, P] = fandp(V, d, L, e, p, u);
Can someone please tell me where I went wrong?

Risposta accettata

James Tursa
James Tursa il 21 Set 2022
Modificato: James Tursa il 21 Set 2022
The error seems pretty clear, you are calling func( ) without enough input arguments. The func( ) signature has six inputs:
function [f]=func(x,e,d,p,V,u)
and here you are calling it with less than six inputs:
a=func(xMin);
b=func(xMax);
:
c=func(x_r);
Instead of passing @func to bisect( ) maybe pass this instead:
@(x)func(x,e,d,p,V,u)

Più risposte (1)

Matt Butts
Matt Butts il 21 Set 2022
I am pretty sure this is because you have defined func as having 6 inputs, but when you call it from within bisect you are only passing one input.

Categorie

Scopri di più su Programming in Help Center e File Exchange

Prodotti


Release

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by