我的代码有问题。它说:
Attempted to access F(2); index out of bounds because numel(F)=1.
我的代码是:
function Punto3
global p n E d Vm rugo
e=0.001:0.02:1;
E=e*10^-3;
d=0.01;
Vm= 10 ;
p= 998.3;
n=1.002*10^-3;
rugo=length(E);
xo=5;
f=fsolve(@(F)ecuacion(F),xo);
end
function resp=ecuacion(F)
global E d re rugo p Vm n
re=(d*p*Vm)/n;
ecu = zeros ([1 rugo]);
for i=1:rugo;
ecu(i)=-2*log10(((E(i)/d)/3.7)+(2.51/(re*(F(i)^0.5))))-(1/(F(i)^(0.5)));
end
resp=ecu;
end
我无法找到错误;请帮忙。
答案 0 :(得分:1)
问题出现是因为您的初始猜测是标量,但F
被假定为rugo
中长度为ecuacion
的向量。来自documentation
:“fsolve
使用x0
中的元素数量和大小来确定fun
接受的变量的数量和大小。”所以将猜测的初始化改为
xo=5*ones(size(e));
不会产生越界错误。
关于问题的物理特性,对于我能想到的大多数应用来说,5
的摩擦系数相当大。猜测0.1
通常对我有用。此外,我发现解决sqrt(F(i))
然后对解决方案进行求解可以避免担心fsolve
中迭代方法的复杂解。所以将for
- 循环代码更改为
function resp=ecuacion(Fsqrt)
...
ecu(i)=-2*log10(((E(i)/d)/3.7)+(2.51/(re*(Fsqrt(i)))))-(1/(Fsqrt(i)));
然后将主函数输出到
f=fsolve(@(F)ecuacion(F),xo).^2;
应该更健壮。