2016-08-07 5 views
0

私のコードに問題があります。それは言う:ループ内のエラー:F(2)にアクセスしようとしました。 numel(F)= 1のためにインデックスが範囲外になる

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 

私は、エラーを見つけることができません。助けてください。あなたの最初の推測がスカラーであるが、Fecuacionの長さrugoのベクトルであると想定されるため、

答えて

1

問題が発生します。 documentationより: "fsolveは、x0の要素数とサイズを使用して、funが受け入れる変数の数とサイズを決定します。したがって、推測の初期化を

xo=5*ones(size(e)); 

に変更しても、範囲外のエラーは発生しません。問題の物理学に関する


5の摩擦係数は、私は考えることができるほとんどのアプリケーションでかなり大きいです。 0.1の推測は、通常、私にとってはうまくいきます。さらに、私はsqrt(F(i))を解いてから解を二乗すると、反復法の複雑な解がfsolveになるのを避けることができました。だから、

function resp=ecuacion(Fsqrt) 
... 
ecu(i)=-2*log10(((E(i)/d)/3.7)+(2.51/(re*(Fsqrt(i)))))-(1/(Fsqrt(i))); 

for -loopコードを変更してから

f=fsolve(@(F)ecuacion(F),xo).^2; 

にメイン関数の出力は、より堅牢でなければなりません。

+0

ありがとう、本当に役に立ちました:D –

関連する問題