Matlab Code verbessern

S

Sina

Guest
Hi!

Ich hab da wieder mal ein Problem. Ich habe einen Code, der mir möglichst 1Mio Stützstellen liefern soll.
Zuerst habe ich das so gelöst:
CODE
while xx<=1
xx2=xx;
y=y0;
%fsolve iteriert in der nachfolgenden Funktion y so lange, bis die
%Funktion 0 ergibt.
[TI, y] = fsolve(@(y)[sqrt(54/pi)*((-1/3)*y* exp((-3/2)*y^2) + (1/18)* pi^(1/2)*6^(1/2)*erf((1/2)*y*sqrt(6)))]-xx2, y);
arrayx(i)=xx2;
arrayTI(i)=TI;
arrayy(i)=y;
i=i+1;
xx=xx2+deltaX;
end



Diese While-Schleife ist aber sehr zeitaufwendig, und bei 1Mio Durchläufen kann das ziemlich auf den Wecker fallen
smile.gif

Ich habe schon versucht, das ganze mit linspace zu verbessern, habe aber irgendwie nicht die Lösung bekommen, die die While-Schleife gebracht hat...
Kann mir hier jemand helfen, und mir sagen, wie ich diesen Teil "schneller" bekomme?

Viele sonnige Grüße,
sina
 
Der erste Schritt wäre wohl erstmal, die ganzen Konstanten-Berechnungen ausserhalb von der while Schleife zu packen...

CODE

q = sqrt(3/2);
r = sqrt(pi/54);
ri = 1/r;

while xx<=1
xx2=xx;
y=y0;
%fsolve iteriert in der nachfolgenden Funktion y so lange, bis die
%Funktion 0 ergibt.
[TI, y] = fsolve(@(y)[ri* (r*erf(q*y) - 0.333333*y*exp(-1.5 * y^2))]-xx2, y);
arrayx(i)=xx2;
arrayTI(i)=TI;
arrayy(i)=y;
i=i+1;
xx=xx2+deltaX;
end




Ich garantiere für nix... mein Mathe ist eingerostet und Matlab kann ich garnet...

PS: was zur Hölle macht eigentlich @(y)[........] ???
 
Das @(y) bedeutet, dass y in der nachfolgenden Funktion so lange iteriert wird, bis die Funktion Null ergibt. Also sozusagen ist der ganze Block eine Nullstellensuche.
smile.gif


Danke, dass mit dem auslagern ist schomal eine gute Idee...
Trotzdem würd ich gern die While-Schleife noch fortbekommen ...
Mal schaun, ob das noch klappt...

Ich wär für jeden Vorschlag offen
smile.gif
 
Mal so als Frage, wozu soll die Schleife dienen? Ohne diese Information ist die Optimierungen nicht gerade einfach.



MfG Sascha Ahlers
 
Ok, sorry
smile.gif


Also, ich habe eine Kurve im Format x=f(y).
Ich benötige diese aber im üblichen Format y=f(x).
Da die einfache Umwandlung nicht funktioniert (oder ich zu blöd dafür bin
smile.gif
)muss ich eine Nullstellensuche durchführen...
Und das tut die While-Schleife im Groben und Ganzen...
hilft euch das weiter?
 
so richtig versteh ich es nicht...

Müsste die Zeile:
CODE [TI, y] = fsolve(@(y)[sqrt(54/pi)*((-1/3)*y* exp((-3/2)*y^2) + (1/18)* pi^(1/2)*6^(1/2)*erf((1/2)*y*sqrt(6)))]-xx2, y);


nicht eigentlich so aussehen:


CODE [y, TI] = fsolve(@(y)[sqrt(54/pi)*((-1/3)*y* exp((-3/2)*y^2) + (1/18)* pi^(1/2)*6^(1/2)*erf((1/2)*y*sqrt(6)))]-xx2, y);


ich habe das hier zu fsolve gefunden:
http://www-ccs.ucsd.edu/matlab/toolbox/optim/fsolve.html

demnach gibt die Funktion als ersten Wert die x-Koordinate zurück (bei dir ist es y) und als 2. Wert den Funktionswert (wobei ich mir nicht ganz sicher bin ob die den Funktionswert f(x) meinen, oder F(x) ist aber in diesem Fall egal)

und @(y)[...] ist wohl sowas wie eine anonyme Funktiondefinition... allerdings habe ich dazu nix gefunden, ich geh einfach mal davon aus.
 
Zurück
Oben