2016-08-07 4 views
0

Ich habe Probleme mit meinem Code. Dort heißt es:Fehler in Schleife: Versuch, auf F (2) zuzugreifen; Index außerhalb der Grenzen, weil numel (F) = 1

Attempted to access F(2); index out of bounds because numel(F)=1. 

An meinem Code:

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 

ich den Fehler nicht finden können; bitte hilfe.

Antwort

1

Das Problem entsteht, weil Ihre anfängliche Schätzung ein Skalar ist, aber F wird angenommen, ein Vektor der Länge rugo in ecuacion zu sein. Von der documentation: "fsolve verwendet die Anzahl der Elemente in und die Größe von x0, um die Anzahl und Größe der Variablen zu bestimmen, die fun akzeptiert." Wenn Sie also die Initialisierung Ihrer Schätzung auf

ändern, wird kein Out-of-Bounds-Fehler generiert.


die Physik des Problems betrifft, ein Reibungsfaktor von 5 ist ziemlich groß für die meisten Anwendungen, die ich denken kann. Eine Schätzung von 0.1 funktioniert normalerweise besser für mich. Ferner habe ich herausgefunden, dass das Lösen nach sqrt(F(i)) und das anschließende Quadrieren der Lösung die Sorge um komplexe Lösungen aus den iterativen Verfahren in fsolve vermeidet. So Ändern der for -loop Code

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

und dann die Hauptfunktion Ausgang

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

sollte robust sein.

+0

Danke, es war wirklich hilfreich: D –

Verwandte Themen