循环错误:尝试访问F(2);由于数字(F)= 1,因此索引越界

时间:2016-08-07 00:14:09

标签: matlab

我的代码有问题。它说:

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

我无法找到错误;请帮忙。

1 个答案:

答案 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;

应该更健壮。