Funktionen auswerten in Matlab

Neue Frage »

Bjoern1982 Auf diesen Beitrag antworten »
Funktionen auswerten in Matlab
Hallo miteinander,

also ich poste mal anbei direkt meinen (recht überschaubaren) Code zur Berechnung eines bestimmten Integrals in den Grenzen a und b mit der Trapezregel (mit Anzahl der Teilintervalle N)

Zitat:
1 function trap = trapez(f,a,b,N)
2 h=(b-a)/N
3 x=[a:h:b]
4 trap=0
5 for k=1:N
6 trap=trap+(h/2)*(feval(f,x(k))+feval(f,x(k+1)))
7 end
8 disp('Die Fläche die der Graph von f im angegebenen Intervall mit der x-Achse einschließt, beträgt: '),trap


Nun mein Problem:

Es soll ja beim Aufruf der Funktion trapez auch direkt ein Funktionsterm f übergeben werden, der dann später in Zeile 6 durch feval ausgewertet werden soll.

Ich sollte das ganze dann mit der Funktion und a=0, b=3 und N=10 testen, jedoch erhalte ich immer Fehlermeldungen wenn ich die Funktion mit trapez('cos(x)*exp(sin(x))',0,3,10) aufrufe (Funktion als String übergeben).

Es kommt dann immer diese Meldung:

Zitat:
??? Error using ==> feval
Invalid function name 'cos(x)*exp(sin(x))'.

Error in ==> C:\MATLAB6p5\work\trapez.m
On line 6 ==> trap=trap+(h/2)*(feval(f,x(k))+feval(f,x(k+1)))


Sieht jemand was ich falsch mache ?

Gruß Björn
555nase Auf diesen Beitrag antworten »

Bau deine Funktion so um:
code:
1:
2:
3:
4:
5:
6:
7:
function trap = trapez(f,a,b,N)
h=(b-a)/N;
x=a:h:b;
trap=0;
for k=1:N
      trap=trap+(h/2)*(f(x(k))+f(x(k+1)));
end

und ruf sie so auf:
code:
1:
2:
3:
f=@(x) cos(x)*exp(sin(x));
trap=trapez(f,0,3,10);
disp(['Die Fläche die der Graph von f im angegebenen' char(13) 'Intervall mit der x-Achse einschließt, beträgt: ' num2str(trap)]);

Klappts?
Bjoern1982 Auf diesen Beitrag antworten »

Hallo,

erstmal vielen Dank für deine Antwort smile

Problem ist, dass meine Matlab Version scheinbar nur die Syntax handle = @functionname unterstützt und somit eine Funktion erwartet.

Deine Alternative entspricht ja der zweiten hier aufgeführten Variante mit der "anonymous function" oder ?

http://www.mathworks.com/access/helpdesk...tnG=Suche&meta=

Ich habe die Version 6.5, scheinbar gibt es das da nicht oder ich bin zu blöd, was auch nicht auszuschließen ist Augenzwinkern

Jedenfalls zeigt der mir auch nur die eine Syntax-Variante an wenn ich "help function_handle" eingebe.

Falls ich richtig liege und es an meiner Version liegt, kennst du noch eine andere Alternative ? Wenn ich trapez mit simplen Funktionstermen für f, wie 'exp' aufrufe, klappt es einwandfrei. Das Problem ist, dass ich bei verketteten Funktionstermen immer Fehlereldungen bekomme.

Gruß Björn
555nase Auf diesen Beitrag antworten »

Klappt es, wenn du dir eine Funktion f.m schreibst:
code:
1:
2:
function ret=f(x)
ret=cos(x).*exp(sin(x));

und dann die Funktion trapez.m
code:
1:
2:
3:
4:
5:
6:
7:
function trap = trapez(f,a,b,N)
h=(b-a)/N;
x=a:h:b;
trap=0;
for k=1:N
      trap=trap+(h/2)*(f(x(k))+f(x(k+1)));
end

aufrufst:
code:
1:
2:
trap=trapez(@f,0,3,1000);
disp(['Die Fläche die der Graph von f im angegebenen' char(13) 'Intervall mit der x-Achse einschließt, beträgt: ' num2str(trap)]);
?
Bjoern1982 Auf diesen Beitrag antworten »

Jaaaa, so gehts smile

Aber schon doof sich dann immer eine neue Funktion schreiben zu müssen und das nicht direkt beim Aufruf der Funktion trapez selbst irgendwie regeln zu können..
Naja Hauptsache es klappt Augenzwinkern

Ist dir sowas bekannt, dass es bei älteren Versionen die Nutzung des Funktion-Handles wie oben von dir beschrieben nicht funktioniert, sprich erst später hinzu kam ?
555nase Auf diesen Beitrag antworten »

Hm, es wurde irgendwann die Möglichkeit mit den handles eingebaut und aus Gründen der Abwärtskompatibilität die String-Methode beibehalten.
Für genaueres müsste ich aber auch in die Doku/Release Notes gucken.
 
 
Bjoern1982 Auf diesen Beitrag antworten »

Da du die String Methode nochmal ansprichst:

Oben schrieb ich ja dass es z.B. mit dem Aufruf von trapez('exp',0,3,100) wunderbar klappt, wo ich die e-Funktion als String übergebe.

Kompliziertere Funktionen als String zu übergeben funktioniert also definitiv nicht ?
555nase Auf diesen Beitrag antworten »

Ne, kompliziertere Funktionen würden so nur funktionieren, wenn du den Namen einer entsprechenden Funktion übergibst: also mit der Funktion f.m von oben:
trapez('f',0,3,10);
Das sollte dann wieder tun...
Bjoern1982 Auf diesen Beitrag antworten »

Alles klar, danke.

Eine letzte Frage noch zu minimalen Funktionsaufrufen bei meiner Funktion trapez.
In der for-Schleife rufe ich ja im Endeffekt die Funktionswerte für a<x<b immer zweimal auf.
Um mit minimalen Funktionsaufrufen auszukommen, wäre dann das hier eine sinnvolle Lösung ?

Zitat:
5 for k=2:N
6 trap=trap+(h/2)*2*feval(f,x(k));
7 end
8 trap=trap+(h/2)*(feval(f,a)+feval(f,b));


wobei (h/2)*2 in Zeile 6 natürlich zu h wird (es ging mir nur um die Anschaulichkeit der Idee)
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »