Matlab M-Editor < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 14:45 Do 01.10.2009 | Autor: | Zuggel |
Aufgabe | Schreibe Sie eine Funtkion in Matlab welche nach dem Heun-Verfahren die folgende Lösung des Chauchy-Problems aproximiert:
[mm] u_{n+1}=u_n +h/2*[f(t_n,u_n)+f(t_n+h,u_n+h*f(t_n,u_n))] [/mm] |
Hallo alle zusammen
Also ich habe das mit Hilfe der bereits gegeben Lösung zusammengeschrieben im M-Editor
function[t,u]=heun(fun,t0,y0,T,N)
h=T/N;
t=[t0:h:t0+T]
u(1)=y0;
for n=1:N
K1=feval(fun,t(n),u(n));
K2=feval(fun,t(n)+h,u(n)+h*K1);
u(n+1)=u(n)+h/2*(K1+K2);
end
Ich hoffe das stimmt so. Jedenfalls, wenn ich das Script ausführe, kommt folgende Fehler-Meldung:
?? Undefined function or method 'heun' for input arguments of type 'char'.
Was hat das zu bedeuten?
Danke sehr
lg
Zuggel
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:08 Do 01.10.2009 | Autor: | pelzig |
Poste doch mal, wie genau du die Funktion heun aufrufst, und was du da als Parameter reinsteckst.
Gruß, Robert
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:32 Mo 05.10.2009 | Autor: | Zuggel |
Entschuldige die etwas verspätete Antwort.
Also ich habe mir am Wochenende ein Matlab Tutorial durchgelesen und wie du auch richtig vermutet hast, habe ich beim Aufrufen einen Fehler gemacht. Jedoch weiß ich noch nicht genau welchen.
Wie ich die Funktion aufgerufen habe?
Nun ich habe im M-Editor auf den Button geklickt, welcher mein Script ausführt, sozusagen ohne Parameter. Ich schätze mal, das funktioniert nicht so richtig ohne Paramter Angabe?
Wäre die der richtige Aufruf dann in Form von:
heun(0,2)
zu machen?
wobei Matlab t=0 und u=2 zuweißt?
Wäre das so korrekt?
Danke sehr
lg
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:48 Mo 05.10.2009 | Autor: | Disap |
Hallo Zuggel!
> Entschuldige die etwas verspätete Antwort.
>
> Also ich habe mir am Wochenende ein Matlab Tutorial
> durchgelesen und wie du auch richtig vermutet hast, habe
> ich beim Aufrufen einen Fehler gemacht. Jedoch weiß ich
> noch nicht genau welchen.
>
> Wie ich die Funktion aufgerufen habe?
>
> Nun ich habe im M-Editor auf den Button geklickt, welcher
> mein Script ausführt, sozusagen ohne Parameter. Ich
> schätze mal, das funktioniert nicht so richtig ohne
> Paramter Angabe?
Richtig: So geht das nicht.
> Wäre die der richtige Aufruf dann in Form von:
>
> heun(0,2)
> zu machen?
>
> wobei Matlab t=0 und u=2 zuweißt?
>
> Wäre das so korrekt?
Nein! Das wäre doch auch unlogisch (ist nicht böse gemeint).
Im Programm steht doch
heun(fun,t0,y0,T,N)
Da sind 5 Eingabeparameter! Du kannst dem Programm also nicht nur 2 Parameter übergeben.
Das Programm gibt dir hinterher die Parameter t und u zurück. Im Quelltext steht ja auch, dass die berechnet werden.
Wie man das Programm aufruft, weiß ich jetzt auch nicht. Wie ist der mathematische Hintergrund? fun soll wohl für eine funktion stehen, t0 und y0? Zum Anfangszeitpunkt [mm] t_0 [/mm] hat die Funktion den Wert [mm] y_0? [/mm] T ist die SChrittweite (bis jetzt alles nur geraten)? Und was ist N? Ich weiß es leider nicht.
MfG
Disap
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 13:31 Di 06.10.2009 | Autor: | Zuggel |
> Hallo Zuggel!
>
> > Entschuldige die etwas verspätete Antwort.
> >
> > Also ich habe mir am Wochenende ein Matlab Tutorial
> > durchgelesen und wie du auch richtig vermutet hast, habe
> > ich beim Aufrufen einen Fehler gemacht. Jedoch weiß ich
> > noch nicht genau welchen.
> >
> > Wie ich die Funktion aufgerufen habe?
> >
> > Nun ich habe im M-Editor auf den Button geklickt, welcher
> > mein Script ausführt, sozusagen ohne Parameter. Ich
> > schätze mal, das funktioniert nicht so richtig ohne
> > Paramter Angabe?
>
> Richtig: So geht das nicht.
>
> > Wäre die der richtige Aufruf dann in Form von:
> >
> > heun(0,2)
> > zu machen?
> >
> > wobei Matlab t=0 und u=2 zuweißt?
> >
> > Wäre das so korrekt?
>
> Nein! Das wäre doch auch unlogisch (ist nicht böse
> gemeint).
> Im Programm steht doch
>
> heun(fun,t0,y0,T,N)
>
> Da sind 5 Eingabeparameter! Du kannst dem Programm also
> nicht nur 2 Parameter übergeben.
>
> Das Programm gibt dir hinterher die Parameter t und u
> zurück. Im Quelltext steht ja auch, dass die berechnet
> werden.
>
> Wie man das Programm aufruft, weiß ich jetzt auch nicht.
> Wie ist der mathematische Hintergrund? fun soll wohl für
> eine funktion stehen, t0 und y0? Zum Anfangszeitpunkt [mm]t_0[/mm]
> hat die Funktion den Wert [mm]y_0?[/mm] T ist die SChrittweite (bis
> jetzt alles nur geraten)? Und was ist N? Ich weiß es
> leider nicht.
>
>
> MfG
> Disap
Zuerst Danke für die Antwort
Also die Aufgabe bestand ja darin das Anfangswert Problem
[mm] u_{n+1}=u_n +h/2\cdot{}[f(t_n,u_n)+f(t_n+h,u_n+h\cdot{}f(t_n,u_n))] [/mm]
durch Heun zu approximentieren
Wie man es auruft verwirrt mich ebenso ein wenig, da ja eben dieser Parameter "fun" drin steckt, aber man ja eigentlich die Funktion bereits im Quellcode gegeben hat. Aber wie du bereits gesagt hast wäre das auch meine Annahme:
fun => Funktion
[mm] t_0=> [/mm] Anfangszeitpunkt
[mm] y_0=> [/mm] sozusagen Startwert
T => wird wahrscheinlich der Endwert sein, oder?
h=> Schrittweite
N=> Anzahl der Iterationen
Werde jetzt etwas herum probieren, schauen ob ich dahinter komme.
Eine andere Frage: Welche Aufgabe erfüllt eigentlich feval() hier?
lg
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:52 Di 06.10.2009 | Autor: | Disap |
Hi!
> Zuerst Danke für die Antwort
Danke für die Anerkennung.
> Also die Aufgabe bestand ja darin das Anfangswert Problem
>
> [mm]u_{n+1}=u_n +h/2\cdot{}[f(t_n,u_n)+f(t_n+h,u_n+h\cdot{}f(t_n,u_n))][/mm]
>
> durch Heun zu approximentieren
Das hatte ich auch verstanden. Mir ist nur nicht der Hintergrund geläufig, wie die Anfangswertaufgabe genau aussieht; also ein konkretes Beispiel wäre hilfreich gewesen.
>
> Wie man es auruft verwirrt mich ebenso ein wenig, da ja
> eben dieser Parameter "fun" drin steckt, aber man ja
> eigentlich die Funktion bereits im Quellcode gegeben hat.
Ja, das verwirrt mich auch. Ich denke, dass die rechte Seite der Anfangsbedingung hier gemeint ist.
> Aber wie du bereits gesagt hast wäre das auch meine
> Annahme:
>
> fun => Funktion
> [mm]t_0=>[/mm] Anfangszeitpunkt
> [mm]y_0=>[/mm] sozusagen Startwert
> T => wird wahrscheinlich der Endwert sein, oder?
> h=> Schrittweite
> N=> Anzahl der Iterationen
Da in dem Code h=T/N ist (Schrittweite), kann das hinkommen
> Werde jetzt etwas herum probieren, schauen ob ich dahinter
> komme.
Ich würde vorschlagen:
heun(@( t,u) sin( t )*u, 0,1,1,100)
Ich kann es leider nicht testen, mir steht Matlab im Moment nicht zur Verfügung.
> Eine andere Frage: Welche Aufgabe erfüllt eigentlich
> feval() hier?
Eine gute Erklärung kann ich dazu selbst nicht abgeben. Ich kann nur auf die Matlab Dokumentation von der offiziellen Homepage verweisen
feval
Vielleicht verstehst du es ja, vielleicht klappt auch der von mir genannte Beispielaufruf.
Beste Grüße
Disap
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:27 Di 06.10.2009 | Autor: | Niladhoc |
Hallo,
feval erstellt eine Matrix aus [mm] x_{i} [/mm] und [mm] y_{j} [/mm] über f(x,y), sodass in der Matrix die Elemente [mm] a_{i,j}=f(x_{i},y_{j}). [/mm] Die eingegebene Funktion musss zuerst über die deff' ' -Funktion compiliert worden sein.
Zur Zeit nutze ich Scilab 5.1.1, was auf Matlab aufbaut( k.a. obs mehr/weniger Inhalte und Funktionen liefert).
Das Programm heun bekomme ich dennoch noch nicht zum laufen.
lg
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 07:29 Do 08.10.2009 | Autor: | Disap |
Hallo!
> Das Programm heun bekomme ich dennoch noch nicht zum
> laufen.
Du hast aber schon berücksichtigt, dass es den Befehl feval nicht in Scilab gibt?
Beste Grüße
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:03 Do 08.10.2009 | Autor: | Niladhoc |
Hallo,
"Name
feval — multiple evaluation
Calling Sequence
[z]=feval(x,y,f)
[z]=feval(x,f)
Parameters
x,y
two vectors
f
function or character string (for Fortran or C call)
Description
Multiple evaluation of a function for one or two arguments of vector type :
z=feval(x,f)
returns the vector z defined by z(i)=f(x(i))
z=feval(x,y,f)
returns the matrix z such as z(i,j)=f(x(i),y(j))
f is an external (function or routine) accepting on one or two arguments which are supposed to be real. The result returned by f can be real or complex. In case of a Fortran call, the function 'f' must be defined in the subroutine ffeval.f (in directory SCIDIR/routines/default)"
Also sieht die Matrix am Ende so aus:
[mm] \pmat{ f(x_{1},y_{1}) & f(x_{1},y_{2}) & ... \\ f(x_{2},y_{1}) & f(x_{2},y_{2}) & ... \\ f(x_{3},y_{1}) & f(x_{3},y_{2}) & ... \\ ... & ... & ... } [/mm] Dabei sind [mm] x_{n} [/mm] und [mm] y_{n} [/mm] die n-ten Elemente der beiden Vektoren, die eingegeben werden.
lg
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 19:48 Mi 07.10.2009 | Autor: | Zuggel |
Also zunächst Danke an alle beteiligten
die Lösung welche ich hier geschrieben habe, habe nicht ich geschrieben sondern ist von unserem Prof. so vorgegeben. Deshalb auch bin ich etwas verwirrt, dass das Programm nicht so leicht zum Laufen gebracht werden konnte. Ich habe den Professor kontaktiert und werde seine Antwort hier posten.
Zu feval und zur compilierung: Also ich habe gesehen, dass feval bei so ziemlich jeder Lösung einer Matlab Aufgabe angewandt wurde, somit könnte ich auch, wenn benötigt, andere Beispiele mit feval posten.
Hier konkret in diesem Beispiel haben wir folgenden Quellcode:
K1=feval(fun,t(n),u(n))
Das heißt, es wird Matrix K! erstellt, nehmen wir an - ich weiß leider auch noch nicht wofür das "fun" steht, aber nehmen wir an, es wäre eine Funktion f(t,u), somit würde in der for-Schleife in diese Funktion jedes mal ein "t" und ein "u" eingesetzt, welches vorher berechnet wurde. Das sind jedoch nur 2 Parameter, fertig.
Wie kann ich mir die Matrix dann vorstellen? Vielleicht so wie folgt:
[mm] \pmat{ t(n) & 0 \\ 0 & u(n) }
[/mm]
oder eher sowas:
[mm] \pmat{ f(t,u) & 0 \\ 0 & f(t,u) }
[/mm]
oder ist es gar nur ein Vektor?
Danke sehr
MfG
Zuggel
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 07:30 Do 08.10.2009 | Autor: | Disap |
Servus.
> die Lösung welche ich hier geschrieben habe, habe nicht
> ich geschrieben sondern ist von unserem Prof. so
> vorgegeben. Deshalb auch bin ich etwas verwirrt, dass das
> Programm nicht so leicht zum Laufen gebracht werden konnte.
> Ich habe den Professor kontaktiert und werde seine Antwort
> hier posten.
>
>
> Zu feval und zur compilierung: Also ich habe gesehen, dass
> feval bei so ziemlich jeder Lösung einer Matlab Aufgabe
> angewandt wurde, somit könnte ich auch, wenn benötigt,
> andere Beispiele mit feval posten.
> Hier konkret in diesem Beispiel haben wir folgenden
> Quellcode:
>
> K1=feval(fun,t(n),u(n))
>
> Das heißt, es wird Matrix K! erstellt, nehmen wir an - ich
> weiß leider auch noch nicht wofür das "fun" steht, aber
> nehmen wir an, es wäre eine Funktion f(t,u), somit würde
> in der for-Schleife in diese Funktion jedes mal ein "t" und
> ein "u" eingesetzt, welches vorher berechnet wurde. Das
> sind jedoch nur 2 Parameter, fertig.
> Wie kann ich mir die Matrix dann vorstellen? Vielleicht so
> wie folgt:
>
> [mm]\pmat{ t(n) & 0 \\ 0 & u(n) }[/mm]
>
> oder eher sowas:
>
> [mm]\pmat{ f(t,u) & 0 \\ 0 & f(t,u) }[/mm]
>
> oder ist es gar nur ein Vektor?
Richtig: das fun ist eine Funktion.
Betrachten wir mal das, was dein Programm beechnen will
$ [mm] u_{n+1}=u_n +h/2\cdot{}[f(t_n,u_n)+f(t_n+h,u_n+h\cdot{}f(t_n,u_n))] [/mm] $
(das hast du ja selbst geschrieben)
Jetzt taucht im Programm plötzlich
K1=feval(fun,t(n),u(n))
auf. Das feval berechnet hier deine Funktion in Abhängigkeit von t(n) und u(n). Im ersten Durchlauf von t(1) und u(1)
Der Verfahren hätte gar keinen Sinn, könntest du die Lösung nicht auch mit Bleistift und Papier berechnen. Früher wurde das nämlich so gemacht
Was bekommst du für K1 wohl raus? Richtig, eine reelle Zahl.
Ob du auch eine Diagonalmatrix übergeben kannst, weiss ich nicht
K2=feval(fun,t(n)+h,u(n)+h*K1);
Das K1 wird hier noch mal verwendet, und ist halt im ersten Durchlauf f(t(1),u(1)). Du könntest auch den Quellcode in eine Zeile schreiben.
Übrigens, ich hatte ja geschrieben
" heun(@( t,u) sin( t )*u, 0,1,1,100) "
was ist denn da die Fehlermeldung? Ist ja eigentlich auch egal, dein Prof wird es dir schon sagen.
MfG
Disap
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 11:04 Do 08.10.2009 | Autor: | Zuggel |
>
> Betrachten wir mal das, was dein Programm beechnen will
>
> [mm]u_{n+1}=u_n +h/2\cdot{}[f(t_n,u_n)+f(t_n+h,u_n+h\cdot{}f(t_n,u_n))][/mm]
>
> (das hast du ja selbst geschrieben)
>
> Jetzt taucht im Programm plötzlich
> K1=feval(fun,t(n),u(n))
> auf. Das feval berechnet hier deine Funktion in
> Abhängigkeit von t(n) und u(n). Im ersten Durchlauf von
> t(1) und u(1)
>
> Der Verfahren hätte gar keinen Sinn, könntest du die
> Lösung nicht auch mit Bleistift und Papier berechnen.
> Früher wurde das nämlich so gemacht
>
> Was bekommst du für K1 wohl raus? Richtig, eine reelle
> Zahl.
> Ob du auch eine Diagonalmatrix übergeben kannst, weiss
> ich nicht
Nun das mit der Diagonalmatrix habe ich wohl falsch verstanden.
Also vergessen wir die Matrix und reden konkret von feval - ich versuche nur die Funktion dieses Ausdruckes zu verstehen, bei dem hänge ich extremst...
feval wertet mir also eine Funktion aus,wieso kann ich dann zB nicht schreiben:
function[]=fe123val(x,y)
[mm] K1=feval(x^2+y,x,y);
[/mm]
disp(['die Zahl ist:',num2str(K1)])
end
FEHLER:
fe123val(3,4)
??? Error using ==> feval
Argument must contain a string or function_handle.
Es ist ja kein Unterschied ob ich hier eine Funktion - in unserem Fall mit nem Namen "fun" bewerten lasse, oder direkt eine Funktion hineinschreibe, oder habe ich das Konzept um feval falsch verstanden?
>
> K2=feval(fun,t(n)+h,u(n)+h*K1);
>
> Das K1 wird hier noch mal verwendet, und ist halt im ersten
> Durchlauf f(t(1),u(1)). Du könntest auch den Quellcode in
> eine Zeile schreiben.
>
> Übrigens, ich hatte ja geschrieben
> " heun(@( t,u) sin( t )*u, 0,1,1,100) "
> was ist denn da die Fehlermeldung? Ist ja eigentlich auch
> egal, dein Prof wird es dir schon sagen.
Entschuldige, ich habs vergessen einzugeben, also Eingabe
" heun(@( t,u) sin( t )*u, 0,1,1,100) "
AUSGABE
_____________________________________________________________________
>> heun(@( t,u) sin( t )*u, 0,1,1,100)
t =
Columns 1 through 6
0 0.0100 0.0200 0.0300 0.0400 0.0500
Columns 7 through 12
0.0600 0.0700 0.0800 0.0900 0.1000 0.1100
Columns 13 through 18
0.1200 0.1300 0.1400 0.1500 0.1600 0.1700
Columns 19 through 24
0.1800 0.1900 0.2000 0.2100 0.2200 0.2300
Columns 25 through 30
0.2400 0.2500 0.2600 0.2700 0.2800 0.2900
Columns 31 through 36
0.3000 0.3100 0.3200 0.3300 0.3400 0.3500
Columns 37 through 42
0.3600 0.3700 0.3800 0.3900 0.4000 0.4100
Columns 43 through 48
0.4200 0.4300 0.4400 0.4500 0.4600 0.4700
Columns 49 through 54
0.4800 0.4900 0.5000 0.5100 0.5200 0.5300
Columns 55 through 60
0.5400 0.5500 0.5600 0.5700 0.5800 0.5900
Columns 61 through 66
0.6000 0.6100 0.6200 0.6300 0.6400 0.6500
Columns 67 through 72
0.6600 0.6700 0.6800 0.6900 0.7000 0.7100
Columns 73 through 78
0.7200 0.7300 0.7400 0.7500 0.7600 0.7700
Columns 79 through 84
0.7800 0.7900 0.8000 0.8100 0.8200 0.8300
Columns 85 through 90
0.8400 0.8500 0.8600 0.8700 0.8800 0.8900
Columns 91 through 96
0.9000 0.9100 0.9200 0.9300 0.9400 0.9500
Columns 97 through 101
0.9600 0.9700 0.9800 0.9900 1.0000
ans =
Columns 1 through 6
0 0.0100 0.0200 0.0300 0.0400 0.0500
Columns 7 through 12
0.0600 0.0700 0.0800 0.0900 0.1000 0.1100
Columns 13 through 18
0.1200 0.1300 0.1400 0.1500 0.1600 0.1700
Columns 19 through 24
0.1800 0.1900 0.2000 0.2100 0.2200 0.2300
Columns 25 through 30
0.2400 0.2500 0.2600 0.2700 0.2800 0.2900
Columns 31 through 36
0.3000 0.3100 0.3200 0.3300 0.3400 0.3500
Columns 37 through 42
0.3600 0.3700 0.3800 0.3900 0.4000 0.4100
Columns 43 through 48
0.4200 0.4300 0.4400 0.4500 0.4600 0.4700
Columns 49 through 54
0.4800 0.4900 0.5000 0.5100 0.5200 0.5300
Columns 55 through 60
0.5400 0.5500 0.5600 0.5700 0.5800 0.5900
Columns 61 through 66
0.6000 0.6100 0.6200 0.6300 0.6400 0.6500
Columns 67 through 72
0.6600 0.6700 0.6800 0.6900 0.7000 0.7100
Columns 73 through 78
0.7200 0.7300 0.7400 0.7500 0.7600 0.7700
Columns 79 through 84
0.7800 0.7900 0.8000 0.8100 0.8200 0.8300
Columns 85 through 90
0.8400 0.8500 0.8600 0.8700 0.8800 0.8900
Columns 91 through 96
0.9000 0.9100 0.9200 0.9300 0.9400 0.9500
Columns 97 through 101
0.9600 0.9700 0.9800 0.9900 1.0000
______________________________________________________________
Hier noch für den Diskussionsbeitrag - die Antwort meines Professors (aus dem ital. ins dt übersetzt):
Sie müssten hier eine andere File erstellen welche das Chauchy Problem definiert, nehmen wir die file "esempio":
function [ftz]=esempio(t,z)
ftz=-t*z;
Die File wird abgespeichert als "esempio.m"
Wenn sie Heun verwenden und ein Chauchy Problem lösen möchten mit folgender Gleichung:
y'=esempio(t,y)
y'=-t*y 2<t<5
y(2)=4
verwenden sie hierfür zB 20 Intervalle, so ist die Matlab Eingabe wie folgt:
[t,u]=heun(@esempio,2,4,3,20)
Ich habe das natürlich gleich mal ausprobiert aber war vom Ergebnis nicht sehr überzeugt:
__________________________
esempio.m
function [y]=esempio(t,y)
y=-t*y
y(2)=4
end
___________________________
heun.m
function[t,u]=heun(fun,t0,y0,T,N)
h=T/N;
t=[t0:h:t0+T]
u(1)=y0;
for n=1:N
K1=feval(fun,t(n),u(n));
K2=feval(fun,t(n)+h,u(n)+h*K1);
u(n+1)=u(n)+h/2*(K1+K2);
end
____________________________
Eingabe:
[t,u]=heun(@esempio,2,4,3,20)
_______________________________
Ausgabe:
t =
Columns 1 through 6
2.0000 2.1500 2.3000 2.4500 2.6000 2.7500
Columns 7 through 12
2.9000 3.0500 3.2000 3.3500 3.5000 3.6500
Columns 13 through 18
3.8000 3.9500 4.1000 4.2500 4.4000 4.5500
Columns 19 through 21
4.7000 4.8500 5.0000
y =
-8
y =
-8 4
y =
-6.0200 -9.8900
y =
-6.0200 4.0000
??? In an assignment A(I) = B, the number of elements in B and
I must be the same.
Error in ==> heun at 8
u(n+1)=u(n)+h/2*(K1+K2);
Tja und den Fehler verstehe ich nier nicht so ganz. Kann mir einer sagen, was hier falsch läuft?
Danke
lg
Zuggel
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:04 Do 08.10.2009 | Autor: | Disap |
Hallo Zuggel.
> Nun das mit der Diagonalmatrix habe ich wohl falsch
> verstanden.
>
> Also vergessen wir die Matrix und reden konkret von feval -
> ich versuche nur die Funktion dieses Ausdruckes zu
> verstehen, bei dem hänge ich extremst...
>
> feval wertet mir also eine Funktion aus,wieso kann ich dann
> zB nicht schreiben:
>
> function[]=fe123val(x,y)
Was soll die 123 da?
>
> [mm]K1=feval(x^2+y,x,y);[/mm]
>
> disp(['die Zahl ist:',num2str(K1)])
>
> end
>
> FEHLER:
>
> fe123val(3,4)
> ??? Error using ==> feval
> Argument must contain a string or function_handle.
Das kannst du nicht machen, weil man schon die Syntax benutzen muss, die für Matlab ausgelegt ist.
feval(...) ist eine Funktionsvorschrift in Matlab, die besagt:
"Mir wird eine Funktion übergeben, und ich möchte die gerne an einer Stelle x=3 auswerten"
Wenn du selbst z. B. eine Funktion [mm] x^2 [/mm] hast und gerne wissen möchtest, welchen Wert die Funktion für x=3 annimmt, rechnest du auch [mm] 3^2 [/mm] = 9. Irgendwie musst du dem Programm ja sagen, was du machen möchtest.
Und dafür gibt es halt den festen Quellcode feval.
So wie du ja auch das disp verwendest.
> Es ist ja kein Unterschied ob ich hier eine Funktion - in
> unserem Fall mit nem Namen "fun" bewerten lasse, oder
> direkt eine Funktion hineinschreibe, oder habe ich das
> Konzept um feval falsch verstanden?
Du kannst die Funktion auch direct übergeben. ABER, dann müsstest du die Funktion fest in dein heun.m File reinschreiben. Bei dir ist das so gedacht, dass du mit heun ALLE Probleme lösen kannst, damit meine ich, dass der Anwender die Funktion fun eingeben kann, ohne den Quellcode jemals zu sehen.
>
> >
> > K2=feval(fun,t(n)+h,u(n)+h*K1);
> >
> > Das K1 wird hier noch mal verwendet, und ist halt im ersten
> > Durchlauf f(t(1),u(1)). Du könntest auch den Quellcode in
> > eine Zeile schreiben.
> >
> > Übrigens, ich hatte ja geschrieben
> > " heun(@( t,u) sin( t )*u, 0,1,1,100) "
> > was ist denn da die Fehlermeldung? Ist ja eigentlich auch
> > egal, dein Prof wird es dir schon sagen.
>
>
> Entschuldige, ich habs vergessen einzugeben, also Eingabe
>
> " heun(@( t,u) sin( t )*u, 0,1,1,100) "
>
>
> AUSGABE
>
> _____________________________________________________________________
>
>
>
> >> heun(@( t,u) sin( t )*u, 0,1,1,100)
>
> t =
>
> Columns 1 through 6
>
> 0 0.0100 0.0200 0.0300 0.0400 0.0500
>
> Columns 7 through 12
>
> 0.0600 0.0700 0.0800 0.0900 0.1000 0.1100
>
> Columns 13 through 18
>
> 0.1200 0.1300 0.1400 0.1500 0.1600 0.1700
>
> Columns 19 through 24
>
> 0.1800 0.1900 0.2000 0.2100 0.2200 0.2300
>
> Columns 25 through 30
>
> 0.2400 0.2500 0.2600 0.2700 0.2800 0.2900
>
> Columns 31 through 36
>
> 0.3000 0.3100 0.3200 0.3300 0.3400 0.3500
>
> Columns 37 through 42
>
> 0.3600 0.3700 0.3800 0.3900 0.4000 0.4100
>
> Columns 43 through 48
>
> 0.4200 0.4300 0.4400 0.4500 0.4600 0.4700
>
> Columns 49 through 54
>
> 0.4800 0.4900 0.5000 0.5100 0.5200 0.5300
>
> Columns 55 through 60
>
> 0.5400 0.5500 0.5600 0.5700 0.5800 0.5900
>
> Columns 61 through 66
>
> 0.6000 0.6100 0.6200 0.6300 0.6400 0.6500
>
> Columns 67 through 72
>
> 0.6600 0.6700 0.6800 0.6900 0.7000 0.7100
>
> Columns 73 through 78
>
> 0.7200 0.7300 0.7400 0.7500 0.7600 0.7700
>
> Columns 79 through 84
>
> 0.7800 0.7900 0.8000 0.8100 0.8200 0.8300
>
> Columns 85 through 90
>
> 0.8400 0.8500 0.8600 0.8700 0.8800 0.8900
>
> Columns 91 through 96
>
> 0.9000 0.9100 0.9200 0.9300 0.9400 0.9500
>
> Columns 97 through 101
>
> 0.9600 0.9700 0.9800 0.9900 1.0000
>
>
> ans =
>
> Columns 1 through 6
>
> 0 0.0100 0.0200 0.0300 0.0400 0.0500
>
> Columns 7 through 12
>
> 0.0600 0.0700 0.0800 0.0900 0.1000 0.1100
>
> Columns 13 through 18
>
> 0.1200 0.1300 0.1400 0.1500 0.1600 0.1700
>
> Columns 19 through 24
>
> 0.1800 0.1900 0.2000 0.2100 0.2200 0.2300
>
> Columns 25 through 30
>
> 0.2400 0.2500 0.2600 0.2700 0.2800 0.2900
>
> Columns 31 through 36
>
> 0.3000 0.3100 0.3200 0.3300 0.3400 0.3500
>
> Columns 37 through 42
>
> 0.3600 0.3700 0.3800 0.3900 0.4000 0.4100
>
> Columns 43 through 48
>
> 0.4200 0.4300 0.4400 0.4500 0.4600 0.4700
>
> Columns 49 through 54
>
> 0.4800 0.4900 0.5000 0.5100 0.5200 0.5300
>
> Columns 55 through 60
>
> 0.5400 0.5500 0.5600 0.5700 0.5800 0.5900
>
> Columns 61 through 66
>
> 0.6000 0.6100 0.6200 0.6300 0.6400 0.6500
>
> Columns 67 through 72
>
> 0.6600 0.6700 0.6800 0.6900 0.7000 0.7100
>
> Columns 73 through 78
>
> 0.7200 0.7300 0.7400 0.7500 0.7600 0.7700
>
> Columns 79 through 84
>
> 0.7800 0.7900 0.8000 0.8100 0.8200 0.8300
>
> Columns 85 through 90
>
> 0.8400 0.8500 0.8600 0.8700 0.8800 0.8900
>
> Columns 91 through 96
>
> 0.9000 0.9100 0.9200 0.9300 0.9400 0.9500
>
> Columns 97 through 101
>
> 0.9600 0.9700 0.9800 0.9900 1.0000
Kein Fehler?! Das heißt, das Programm ist korrekt durchgelaufen. Intelligenter wäre die Eingabe
[t,u]=heun(@( t,u) sin( t )*u, 0,1,1,100)
gewesen.
______________________________________________________________
>
>
>
>
> Hier noch für den Diskussionsbeitrag - die Antwort meines
> Professors (aus dem ital. ins dt übersetzt):
>
> Sie müssten hier eine andere File erstellen welche das
> Chauchy Problem definiert, nehmen wir die file "esempio":
>
> function [ftz]=esempio(t,z)
> ftz=-t*z;
>
> Die File wird abgespeichert als "esempio.m"
>
> Wenn sie Heun verwenden und ein Chauchy Problem lösen
> möchten mit folgender Gleichung:
>
> y'=esempio(t,y)
>
> y'=-t*y 2<t<5
> y(2)=4
>
> verwenden sie hierfür zB 20 Intervalle, so ist die Matlab
> Eingabe wie folgt:
>
>
> [t,u]=heun(@esempio,2,4,3,20)
>
>
>
> Ich habe das natürlich gleich mal ausprobiert aber war vom
> Ergebnis nicht sehr überzeugt:
>
> __________________________
> esempio.m
>
> function [y]=esempio(t,y)
>
> y=-t*y
Ich bin mir nicht so sicher, ob das hier überhaupt in Matlab funktioniert, in Java ist der Code natürlich
c = 10 + c
Aber ob das in Matlab auch funktioniert, ich habe da so meine Zweifel. Das hat dein Prof oben auch anders geschrieben ;)
> y(2)=4
>
> end
>
> ___________________________
>
> heun.m
>
> function[t,u]=heun(fun,t0,y0,T,N)
> h=T/N;
> t=[t0:h:t0+T]
> u(1)=y0;
> for n=1:N
> K1=feval(fun,t(n),u(n));
> K2=feval(fun,t(n)+h,u(n)+h*K1);
> u(n+1)=u(n)+h/2*(K1+K2);
>
>
>
>
> end
>
> ____________________________
>
>
> Eingabe:
>
> [t,u]=heun(@esempio,2,4,3,20)
>
>
>
> _______________________________
>
> Ausgabe:
>
>
>
> t =
>
> Columns 1 through 6
>
> 2.0000 2.1500 2.3000 2.4500 2.6000 2.7500
>
> Columns 7 through 12
>
> 2.9000 3.0500 3.2000 3.3500 3.5000 3.6500
>
> Columns 13 through 18
>
> 3.8000 3.9500 4.1000 4.2500 4.4000 4.5500
>
> Columns 19 through 21
>
> 4.7000 4.8500 5.0000
>
>
> y =
>
> -8
>
>
> y =
>
> -8 4
>
>
> y =
>
> -6.0200 -9.8900
>
>
> y =
>
> -6.0200 4.0000
>
> ??? In an assignment A(I) = B, the number of elements in
> B and
> I must be the same.
>
> Error in ==> heun at 8
> u(n+1)=u(n)+h/2*(K1+K2);
>
> Tja und den Fehler verstehe ich nier nicht so ganz. Kann
> mir einer sagen, was hier falsch läuft?
Also der Fehler, den ich vermute, ist eben diese Zeile y = -t*y
-t*u wäre sinnvoll.
Die Idee hier ist jedenfalls, die Funktion, die wir übergeben möchten, in eine .m Datei zu schreiben. Also im Prinzip genau dasselbe, wie ich dir das vorgeschlagen habe.
Der Aufruf
[t,u]=heun(@( t,u) -t*u,2,4,3,20)
sollte funktionieren
Das @(t,u) bedeutet, dass du eine Funktion in Abhängigkeit der Variablen t und u übergibst.
Schreibst du das nicht hin, hält Matlab es (ist nur eine These) wahrscheinlich für Konstanten, ohne die Funktioniert es jedenfalls nicht.
MfG
Disap
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 15:52 Do 08.10.2009 | Autor: | Zuggel |
> Hallo Zuggel.
>
> > Nun das mit der Diagonalmatrix habe ich wohl falsch
> > verstanden.
> >
> > Also vergessen wir die Matrix und reden konkret von feval -
> > ich versuche nur die Funktion dieses Ausdruckes zu
> > verstehen, bei dem hänge ich extremst...
> >
> > feval wertet mir also eine Funktion aus,wieso kann ich dann
> > zB nicht schreiben:
> >
> > function[]=fe123val(x,y)
>
> Was soll die 123 da?
War nur eine schnelle ungeistreiche Namensgebung ;)
>
> >
> > [mm]K1=feval(x^2+y,x,y);[/mm]
> >
> > disp(['die Zahl ist:',num2str(K1)])
> >
> > end
> >
> > FEHLER:
> >
> > fe123val(3,4)
> > ??? Error using ==> feval
> > Argument must contain a string or function_handle.
>
> Das kannst du nicht machen, weil man schon die Syntax
> benutzen muss, die für Matlab ausgelegt ist.
> feval(...) ist eine Funktionsvorschrift in Matlab, die
> besagt:
> "Mir wird eine Funktion übergeben, und ich möchte die
> gerne an einer Stelle x=3 auswerten"
>
> Wenn du selbst z. B. eine Funktion [mm]x^2[/mm] hast und gerne
> wissen möchtest, welchen Wert die Funktion für x=3
> annimmt, rechnest du auch [mm]3^2[/mm] = 9. Irgendwie musst du dem
> Programm ja sagen, was du machen möchtest.
> Und dafür gibt es halt den festen Quellcode feval.
>
> So wie du ja auch das disp verwendest.
Achso, also will er nur eine Funktion bekommen. Also ich habe ein paar mal versucht, mit dem Beispiel das du genannt hast und feval, dabei habe ich eine file "auswertung.m" angelegt - ich möchte sozusagen die file auswertung aufrufen und dabei die Funktion eingeben und die x Koordinate, als Ergebnis sollte dann die y Koordinate durch feval ausgewertet werden.
Der Inhalt dieser File:
function[]=auswertung(fun,x)
y=feval(fun,x);
disp(['Ergebnis:' num2str(y)])
end
Der Aufruf (ist für mich noch eine kleine Schiwerigkeit):
[x,y]=auswertung(@( x,y) [mm] x^2,2)
[/mm]
sollte ja dann eigentlich der Wert "4" herauskommen, wobei ich hier die Fehlermeldung hatte:
??? Error using ==> auswertung
Too many output arguments.
Dann dachte ich mir, vielleicht könnte es so gehen - dadurch dass ich ja y nicht eingebe, sondern ja nur "x":
[x]=auswertung(@( x) [mm] x^2,2)
[/mm]
wieder der selbe Fehler.
Was mache ich hier falsch?
>
>
>
> > Es ist ja kein Unterschied ob ich hier eine Funktion - in
> > unserem Fall mit nem Namen "fun" bewerten lasse, oder
> > direkt eine Funktion hineinschreibe, oder habe ich das
> > Konzept um feval falsch verstanden?
>
> Du kannst die Funktion auch direct übergeben. ABER, dann
> müsstest du die Funktion fest in dein heun.m File
> reinschreiben. Bei dir ist das so gedacht, dass du mit heun
> ALLE Probleme lösen kannst, damit meine ich, dass der
> Anwender die Funktion fun eingeben kann, ohne den Quellcode
> jemals zu sehen.
>
> >
> > >
> > > K2=feval(fun,t(n)+h,u(n)+h*K1);
> > >
> > > Das K1 wird hier noch mal verwendet, und ist halt im ersten
> > > Durchlauf f(t(1),u(1)). Du könntest auch den Quellcode in
> > > eine Zeile schreiben.
> > >
> > > Übrigens, ich hatte ja geschrieben
> > > " heun(@( t,u) sin( t )*u, 0,1,1,100) "
> > > was ist denn da die Fehlermeldung? Ist ja eigentlich auch
> > > egal, dein Prof wird es dir schon sagen.
> >
> >
> > Entschuldige, ich habs vergessen einzugeben, also Eingabe
> >
> > " heun(@( t,u) sin( t )*u, 0,1,1,100) "
> >
>> GEKÜRZT AUS ÜBERSICHTSGRÜNDEN
>
> Kein Fehler?! Das heißt, das Programm ist korrekt
> durchgelaufen. Intelligenter wäre die Eingabe
>
> [t,u]=heun(@( t,u) sin( t )*u, 0,1,1,100)
>
> gewesen.
>
Nun die Ausgabe ist gleich lang, worin liegt der Unterschied?
> ______________________________________________________________
> >
> >
> >
> >
> > Hier noch für den Diskussionsbeitrag - die Antwort meines
> > Professors (aus dem ital. ins dt übersetzt):
> >
> > Sie müssten hier eine andere File erstellen welche das
> > Chauchy Problem definiert, nehmen wir die file "esempio":
> >
> > function [ftz]=esempio(t,z)
> > ftz=-t*z;
> >
> > Die File wird abgespeichert als "esempio.m"
> >
> > Wenn sie Heun verwenden und ein Chauchy Problem lösen
> > möchten mit folgender Gleichung:
> >
> > y'=esempio(t,y)
> >
> > y'=-t*y 2<t<5
> > y(2)=4
> >
> > verwenden sie hierfür zB 20 Intervalle, so ist die Matlab
> > Eingabe wie folgt:
> >
> >
> > [t,u]=heun(@esempio,2,4,3,20)
> >
> >
> >
> > Ich habe das natürlich gleich mal ausprobiert aber war vom
> > Ergebnis nicht sehr überzeugt:
> >
> > __________________________
> > esempio.m
> >
> > function [y]=esempio(t,y)
> >
> > y=-t*y
>
> Ich bin mir nicht so sicher, ob das hier überhaupt in
> Matlab funktioniert, in Java ist der Code natürlich
>
> c = 10 + c
> Aber ob das in Matlab auch funktioniert, ich habe da so
> meine Zweifel. Das hat dein Prof oben auch anders
> geschrieben ;)
>
> > y(2)=4
Das mag sein, zu meiner Entschuldigung ich bin selbst "überrascht" von mir, dass ich so viel verlernt habe in dem Jahr, wo ich Matlab nichtmehr benutzt habe....
> Also der Fehler, den ich vermute, ist eben diese Zeile y =
> -t*y
>
> -t*u wäre sinnvoll.
>
> Die Idee hier ist jedenfalls, die Funktion, die wir
> übergeben möchten, in eine .m Datei zu schreiben. Also im
> Prinzip genau dasselbe, wie ich dir das vorgeschlagen
> habe.
>
> Der Aufruf
>
> [t,u]=heun(@( t,u) -t*u,2,4,3,20)
>
> sollte funktionieren
>
> Das @(t,u) bedeutet, dass du eine Funktion in Abhängigkeit
> der Variablen t und u übergibst.
> Schreibst du das nicht hin, hält Matlab es (ist nur eine
> These) wahrscheinlich für Konstanten, ohne die
> Funktioniert es jedenfalls nicht.
Danke Danke und nochmal Danke.
Also ich habe natürlich wieder herumprobiert und die "esempio.m" muss so aussehen damit der Aufruf:
[t,u]=heun(@esempio,2,4,3,20)
funktioniert:
function [y]=esempio(t,u)
y=-t*u
end
Ganz simpel und logisch, das dürfte auch beantworten, ob dein Aufruf funktioniert, das darf ich mit "ja" beantworten (die Rede ist vom Aufruf: [t,u]=heun(@( t,u) -t*u,2,4,3,20) )
Danke sehr an dieser Stelle
lg
Zuggel
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:51 Do 08.10.2009 | Autor: | Disap |
> Achso, also will er nur eine Funktion bekommen. Also ich
> habe ein paar mal versucht, mit dem Beispiel das du genannt
> hast und feval, dabei habe ich eine file "auswertung.m"
> angelegt - ich möchte sozusagen die file auswertung
> aufrufen und dabei die Funktion eingeben und die x
> Koordinate, als Ergebnis sollte dann die y Koordinate durch
> feval ausgewertet werden.
>
> Der Inhalt dieser File:
>
> function[]=auswertung(fun,x)
>
>
> y=feval(fun,x);
> disp(['Ergebnis:' num2str(y)])
>
> end
Versuche es mal mit
function [y]=auswertung(fun,x)
So wie du es geschrieben hast, kann das Programm auswertung schon mal gar nichts zurückgeben?
Dann ist der aufruf doch wie bei heun (wobei das bei fun,x das x besser x0 wäre? )
auswertung(@(x) [mm] x^2, [/mm] 2)
bzw so, wie du gesagt hast.
Wenn es keine Ausgabe in der Konsole gibt, schreib
z = auswertung(@(x) [mm] x^2, [/mm] 2)
Ich bin leider auch nicht mehr vertaut mit Matlab. Kann also auch nur ein spekulieren. Sorry
> Der Aufruf (ist für mich noch eine kleine Schiwerigkeit):
>
>
> [x,y]=auswertung(@( x,y) [mm]x^2,2)[/mm]
>
> sollte ja dann eigentlich der Wert "4" herauskommen, wobei
> ich hier die Fehlermeldung hatte:
>
>
> ??? Error using ==> auswertung
> Too many output arguments.
>
> Dann dachte ich mir, vielleicht könnte es so gehen -
> dadurch dass ich ja y nicht eingebe, sondern ja nur "x":
>
>
> [x]=auswertung(@( x) [mm]x^2,2)[/mm]
>
> wieder der selbe Fehler.
>
> Was mache ich hier falsch?
>
>
> >> GEKÜRZT AUS ÜBERSICHTSGRÜNDEN
> >
> > Kein Fehler?! Das heißt, das Programm ist korrekt
> > durchgelaufen. Intelligenter wäre die Eingabe
> >
> > [t,u]=heun(@( t,u) sin( t )*u, 0,1,1,100)
> >
> > gewesen.
> >
>
> Nun die Ausgabe ist gleich lang, worin liegt der
> Unterschied?
Dann kann man weiterhin in der Konsole auf das Ergebnis [t,u] = heun(...) war glaube ich der Aufruf? Dann steht das Ergebnis weiterhin mit [t,u] zur Verfügung... oder so
Gibt eigentlich keinen Unterschied.
> Danke Danke und nochmal Danke.
Bitte!
Ich rate aber selbst nur rum.
> Also ich habe natürlich wieder herumprobiert und die
> "esempio.m" muss so aussehen damit der Aufruf:
>
> [t,u]=heun(@esempio,2,4,3,20)
>
> funktioniert:
>
> function [y]=esempio(t,u)
>
> y=-t*u
>
>
> end
>
>
>
> Ganz simpel und logisch, das dürfte auch beantworten, ob
> dein Aufruf funktioniert, das darf ich mit "ja" beantworten
> (die Rede ist vom Aufruf: [t,u]=heun(@( t,u)
> -t*u,2,4,3,20) )
Edit: Übrigens danke dafür, dass du noch gesagt hast, wie man es jetzt richtig machen könnte.
MfG!
Disap
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 10:05 Fr 09.10.2009 | Autor: | Zuggel |
> > Achso, also will er nur eine Funktion bekommen. Also ich
> > habe ein paar mal versucht, mit dem Beispiel das du genannt
> > hast und feval, dabei habe ich eine file "auswertung.m"
> > angelegt - ich möchte sozusagen die file auswertung
> > aufrufen und dabei die Funktion eingeben und die x
> > Koordinate, als Ergebnis sollte dann die y Koordinate durch
> > feval ausgewertet werden.
> >
> > Der Inhalt dieser File:
> >
> > function[]=auswertung(fun,x)
> >
> >
> > y=feval(fun,x);
> > disp(['Ergebnis:' num2str(y)])
> >
> > end
>
> Versuche es mal mit
>
> function [y]=auswertung(fun,x)
>
> So wie du es geschrieben hast, kann das Programm auswertung
> schon mal gar nichts zurückgeben?
>
> Dann ist der aufruf doch wie bei heun (wobei das bei fun,x
> das x besser x0 wäre? )
>
> auswertung(@(x) [mm]x^2,[/mm] 2)
>
> bzw so, wie du gesagt hast.
>
> Wenn es keine Ausgabe in der Konsole gibt, schreib
>
> z = auswertung(@(x) [mm]x^2,[/mm] 2)
>
> Ich bin leider auch nicht mehr vertaut mit Matlab. Kann
> also auch nur ein spekulieren. Sorry
>
> > Der Aufruf (ist für mich noch eine kleine Schiwerigkeit):
> >
> >
> > [x,y]=auswertung(@( x,y) [mm]x^2,2)[/mm]
> >
> > sollte ja dann eigentlich der Wert "4" herauskommen, wobei
> > ich hier die Fehlermeldung hatte:
> >
> >
> > ??? Error using ==> auswertung
> > Too many output arguments.
> >
> > Dann dachte ich mir, vielleicht könnte es so gehen -
> > dadurch dass ich ja y nicht eingebe, sondern ja nur "x":
> >
> >
> > [x]=auswertung(@( x) [mm]x^2,2)[/mm]
> >
> > wieder der selbe Fehler.
> >
> > Was mache ich hier falsch?
> >
> >
>
> > >> GEKÜRZT AUS ÜBERSICHTSGRÜNDEN
> > >
> > > Kein Fehler?! Das heißt, das Programm ist korrekt
> > > durchgelaufen. Intelligenter wäre die Eingabe
> > >
> > > [t,u]=heun(@( t,u) sin( t )*u, 0,1,1,100)
> > >
> > > gewesen.
> > >
> >
> > Nun die Ausgabe ist gleich lang, worin liegt der
> > Unterschied?
>
> Dann kann man weiterhin in der Konsole auf das Ergebnis
> [t,u] = heun(...) war glaube ich der Aufruf? Dann steht das
> Ergebnis weiterhin mit [t,u] zur Verfügung... oder so
> Gibt eigentlich keinen Unterschied.
>
>
>
> > Danke Danke und nochmal Danke.
>
> Bitte!
> Ich rate aber selbst nur rum.
Auch wenn du nur herum ratest, hast du mir sehr geholfen.
Also wir hatten die Aussage:
function [y]=auswertung(fun,x)
FEHLER:
>> auswertung(@(x) 2)
??? Input argument "x" is undefined.
Habe dann die "auswertung.m" umgeschrieben
function[y,x]=auswertung(fun,x)
y=feval(fun,x);
disp(['Ergebnis:' num2str(y)])
end
Aufruf:
auswertung(@(x) [mm] x^3, [/mm] 2)
Ergebnis:8
Ich frage mich allerdings um den Sinn des @(x) - weißt du dazu vielleicht noch etwas? Du hast vorher gesagt du spekulierst darauf, dass Matlab das als konstante nimmt, aber beim fehlerhaften Aufruf "auswertung [mm] (x^3,2) [/mm] würde ja [mm] x^3 [/mm] als "fun" eingehen und somit wohl nicht als Konstante gelten?
Danke nochmals ;)
lg
Zuggel
Funktioniert also.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:05 Fr 09.10.2009 | Autor: | Disap |
> Also wir hatten die Aussage:
>
> function [y]=auswertung(fun,x)
>
> FEHLER:
>
> >> auswertung(@(x) 2)
> ??? Input argument "x" is undefined.
>
> Habe dann die "auswertung.m" umgeschrieben
>
>
> function[y,x]=auswertung(fun,x)
>
>
> y=feval(fun,x);
> disp(['Ergebnis:' num2str(y)])
>
> end
>
> Aufruf:
> auswertung(@(x) [mm]x^3,[/mm] 2)
> Ergebnis:8
>
> Ich frage mich allerdings um den Sinn des @(x) - weißt du
> dazu vielleicht noch etwas? Du hast vorher gesagt du
> spekulierst darauf, dass Matlab das als konstante nimmt,
> aber beim fehlerhaften Aufruf "auswertung [mm](x^3,2)[/mm] würde ja
> [mm]x^3[/mm] als "fun" eingehen und somit wohl nicht als Konstante
> gelten?
Betrachten wir mal das K1
K1=feval(fun,t(n),u(n));
Mittlerweile hatten wir doch das Beispiel y'=-t*y, also wird
als fun unser -t*u uebergeben (vielleicht auch y statt u, bin gerade zu faul, im Code nachzugucken)
Ich glaube, im Programm hattest du auch Parameter t0 und y0 übergeben mit t0=2 und u0 = 4
jetzt rechnest du von Hand im ersten Schritt
K1=feval(fun,t(0),u(0));
K1 = -2*4
(im Matlab ist es t(1) und u(1) aus Implementierungsgründen )
durch @(t,u) sagst du Matlab, dass Matlab Variablen in einer Funktion übergeben bekommt und für t und u entsprechende Werte übergeben soll.
Probier mal den Aufruf auswertung(@(x) [mm] a*x^3, [/mm] 2)
Kommt da zufällig a*8 heraus? (wäre nach meiner Logik so, aber vielleicht meckert Matlab da trotzdem)
Um auf das @(x) ein weiteres Mal zu sprechen zu kommen, guck mal das genau an:
auswertung(@(x) [mm] x^3, [/mm] 2)
wenn du das @(x) weglässt, dann hast du doch im Prinzip nur den Aufruf
[mm] auswertung(x^3,2)
[/mm]
Das [mm] x^3 [/mm] wird von Matlab dann als irgendeine Zahl hoch 3 interpretiert.
Das heißt, du gibst in der Konsole ein
x=2
und dann [mm] auswertung(x^3,2) [/mm]
ist im mathematischen Sinne auswertung(8,2)
jetzt denkt Matlab, diese 8 ist z. B. unser t0 und die 2 unser u0 aus dem heun Beispiel.
Matlab interpretiert:"Aha, da arbeite ich mit einer Konstanten - aber keine Funktion"
Wenn du in der Konsole x=2; weglässt, dann weiß Matlab nicht, was [mm] auswertung(x^3,2) [/mm] ist. Denn was ist [mm] x^3? [/mm] Keine Funktion, denn der @-Parameter fehlt doch. Ist es eine Konstante? Nein! Wir haben x=2 nicht in der Konsole geschrieben
Also hat Matlab nur ein x, aber es ist nicht definiert, was x ist.
Beste Grüße
Disap
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 13:39 Sa 10.10.2009 | Autor: | Zuggel |
> > Also wir hatten die Aussage:
> >
> > function [y]=auswertung(fun,x)
> >
> > FEHLER:
> >
> > >> auswertung(@(x) 2)
> > ??? Input argument "x" is undefined.
> >
> > Habe dann die "auswertung.m" umgeschrieben
> >
> >
> > function[y,x]=auswertung(fun,x)
> >
> >
> > y=feval(fun,x);
> > disp(['Ergebnis:' num2str(y)])
> >
> > end
> >
> > Aufruf:
> > auswertung(@(x) [mm]x^3,[/mm] 2)
> > Ergebnis:8
> >
> > Ich frage mich allerdings um den Sinn des @(x) - weißt du
> > dazu vielleicht noch etwas? Du hast vorher gesagt du
> > spekulierst darauf, dass Matlab das als konstante nimmt,
> > aber beim fehlerhaften Aufruf "auswertung [mm](x^3,2)[/mm] würde ja
> > [mm]x^3[/mm] als "fun" eingehen und somit wohl nicht als Konstante
> > gelten?
>
> Betrachten wir mal das K1
>
> K1=feval(fun,t(n),u(n));
>
> Mittlerweile hatten wir doch das Beispiel y'=-t*y, also
> wird
>
> als fun unser -t*u uebergeben (vielleicht auch y statt u,
> bin gerade zu faul, im Code nachzugucken)
>
> Ich glaube, im Programm hattest du auch Parameter t0 und y0
> übergeben mit t0=2 und u0 = 4
>
> jetzt rechnest du von Hand im ersten Schritt
> K1=feval(fun,t(0),u(0));
>
> K1 = -2*4
>
> (im Matlab ist es t(1) und u(1) aus
> Implementierungsgründen )
>
> durch @(t,u) sagst du Matlab, dass Matlab Variablen in
> einer Funktion übergeben bekommt und für t und u
> entsprechende Werte übergeben soll.
Also ums genauer auszudrücken sage ich Matlab mit @(t,u) dass ich ihm eine Funktion gebe welche 2 Variabeln enthält die t und u heißen, oder?
>
> Probier mal den Aufruf auswertung(@(x) [mm]a*x^3,[/mm] 2)
>
> Kommt da zufällig a*8 heraus? (wäre nach meiner Logik so,
> aber vielleicht meckert Matlab da trotzdem)
>
wie erwartet meckert Matlab => a ist undefiniert , habe auch verschiedene Wege versucht
auswertung(@(x,a) [mm] a*x^3, [/mm] 2)
Fehler, auch das Umschreiben von "auswertung.m" und das dortige definieren von "a" hat nicht geklappt.
bzw a=3
auswertung(@(x) [mm] a*x^3,2) [/mm]
Ergebnis 24
Also wird feval wahrscheinlich IMMER für jede Variable einen Wert brauchen, anders kann ich mir die Fehlermeldungen von Matlab nicht erklären. Außer du weißt in dieser Hinsicht mehr als ich.
Ich habe das ganze mal anhand von [mm] x^3*a+x^2*b [/mm] versucht, ich wollte also das Schema f1(x)*a+f2(x)*b per feval lösen, mein Code:
function[y,a,b]=formel(fun1,fun2,x)
K1=feval(fun1,x);
K2=feval(fun2,x);
y=K1*a+K2*b;
%disp(['die Zahl ist:',num2str(K1)])
end
mit dem Aufruf: formel(@(x) [mm] x^3,@(x) x^2,1)
[/mm]
wie erwartet meldet Matlab:
??? Undefined function or variable "a".
Ich schätze wenn man folgendes Ergebnis haben möchte:
1*a + 1*b
dann muss man wohl oder übel mit der disp[('')]-Funktion arbeiten müssen. Oder weißt du etwas anderes?
> Um auf das @(x) ein weiteres Mal zu sprechen zu kommen,
> guck mal das genau an:
> auswertung(@(x) [mm]x^3,[/mm] 2)
>
> wenn du das @(x) weglässt, dann hast du doch im Prinzip
> nur den Aufruf
> [mm]auswertung(x^3,2)[/mm]
>
> Das [mm]x^3[/mm] wird von Matlab dann als irgendeine Zahl hoch 3
> interpretiert.
>
> Das heißt, du gibst in der Konsole ein
>
> x=2
>
> und dann [mm]auswertung(x^3,2)[/mm]
> ist im mathematischen Sinne auswertung(8,2)
>
> jetzt denkt Matlab, diese 8 ist z. B. unser t0 und die 2
> unser u0 aus dem heun Beispiel.
> Matlab interpretiert:"Aha, da arbeite ich mit einer
> Konstanten - aber keine Funktion"
>
> Wenn du in der Konsole x=2; weglässt, dann weiß Matlab
> nicht, was [mm]auswertung(x^3,2)[/mm] ist. Denn was ist [mm]x^3?[/mm] Keine
> Funktion, denn der @-Parameter fehlt doch. Ist es eine
> Konstante? Nein! Wir haben x=2 nicht in der Konsole
> geschrieben
>
> Also hat Matlab nur ein x, aber es ist nicht definiert, was
> x ist.
Danke für die Erklärung, diesen Part habe ich verstanden :)
lg
Zuggel
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:01 Sa 10.10.2009 | Autor: | Disap |
Hallo!
> > durch @(t,u) sagst du Matlab, dass Matlab Variablen in
> > einer Funktion übergeben bekommt und für t und u
> > entsprechende Werte übergeben soll.
>
> Also ums genauer auszudrücken sage ich Matlab mit @(t,u)
> dass ich ihm eine Funktion gebe welche 2 Variabeln enthält
> die t und u heißen, oder?
Ganz genau.
> > Probier mal den Aufruf auswertung(@(x) [mm]a*x^3,[/mm] 2)
> >
> > Kommt da zufällig a*8 heraus? (wäre nach meiner Logik so,
> > aber vielleicht meckert Matlab da trotzdem)
> >
>
> wie erwartet meckert Matlab => a ist undefiniert , habe
> auch verschiedene Wege versucht
>
> auswertung(@(x,a) [mm]a*x^3,[/mm] 2)
>
> Fehler, auch das Umschreiben von "auswertung.m" und das
> dortige definieren von "a" hat nicht geklappt.
Das ist auch eine gute Idee gewesen
> bzw a=3
> auswertung(@(x) [mm]a*x^3,2)[/mm]
>
> Ergebnis 24
>
> Also wird feval wahrscheinlich IMMER für jede Variable
> einen Wert brauchen, anders kann ich mir die
> Fehlermeldungen von Matlab nicht erklären. Außer du
> weißt in dieser Hinsicht mehr als ich.
>
> Ich habe das ganze mal anhand von [mm]x^3*a+x^2*b[/mm] versucht, ich
> wollte also das Schema f1(x)*a+f2(x)*b per feval lösen,
> mein Code:
>
> function[y,a,b]=formel(fun1,fun2,x)
>
>
> K1=feval(fun1,x);
> K2=feval(fun2,x);
> y=K1*a+K2*b;
>
> %disp(['die Zahl ist:',num2str(K1)])
>
> end
>
>
> mit dem Aufruf: formel(@(x) [mm]x^3,@(x) x^2,1)[/mm]
>
> wie erwartet meldet Matlab:
>
> ??? Undefined function or variable "a".
>
> Ich schätze wenn man folgendes Ergebnis haben möchte:
>
> 1*a + 1*b
>
> dann muss man wohl oder übel mit der disp[('')]-Funktion
> arbeiten müssen. Oder weißt du etwas anderes?
>
Genau auf die Ausgabe wollte ich hinaus. Aber dann gehts wohl in Matlab nicht? Ich weiß zumindest nicht, wie.
Ist ja auch nicht so interessant für dich, nehme ich an. Wenn ihr jetzt die Verfahren von Heun und Runge Kutta etc. implementiert.
> > Um auf das @(x) ein weiteres Mal zu sprechen zu kommen,
> > guck mal das genau an:
> > auswertung(@(x) [mm]x^3,[/mm] 2)
> >
> > wenn du das @(x) weglässt, dann hast du doch im Prinzip
> > nur den Aufruf
> > [mm]auswertung(x^3,2)[/mm]
> >
> > Das [mm]x^3[/mm] wird von Matlab dann als irgendeine Zahl hoch 3
> > interpretiert.
> >
> > Das heißt, du gibst in der Konsole ein
> >
> > x=2
> >
> > und dann [mm]auswertung(x^3,2)[/mm]
> > ist im mathematischen Sinne auswertung(8,2)
> >
> > jetzt denkt Matlab, diese 8 ist z. B. unser t0 und die 2
> > unser u0 aus dem heun Beispiel.
> > Matlab interpretiert:"Aha, da arbeite ich mit einer
> > Konstanten - aber keine Funktion"
> >
> > Wenn du in der Konsole x=2; weglässt, dann weiß Matlab
> > nicht, was [mm]auswertung(x^3,2)[/mm] ist. Denn was ist [mm]x^3?[/mm] Keine
> > Funktion, denn der @-Parameter fehlt doch. Ist es eine
> > Konstante? Nein! Wir haben x=2 nicht in der Konsole
> > geschrieben
> >
> > Also hat Matlab nur ein x, aber es ist nicht definiert, was
> > x ist.
>
> Danke für die Erklärung, diesen Part habe ich verstanden
Bitte :)
Ich denke, dass du - wenn du das Verfahren von Heun und den Aufruf jetzt verstanden hast - auch die anderen Näherungsmethoden implementieren könntest, wenn du wolltest. Dann hast du ja jetzt viel gelernt ;)
Für die Problemstellung, dass man gerne [mm] a*x^2 [/mm] - und a als Scharparameter (so haben wir es immer in der Schule bezeichnet) übergeben kann und dann iauch in Abhängigkeit von a das Ergebnis erhält, weiß ich leider auch keinen Rat.
Viele Grüße
Disap
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:23 Mo 12.10.2009 | Autor: | Zuggel |
Alles klar ;)
Danke sehr
ja ich hoffe doch wohl sehr, dass die anderen Problemstellungen jetzt kein Problem mehr sind. Werde sie mir die nächsten Tage mal unter die Lupe nehmen :)
Danke nochmal
lg
Zuggel
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:20 Mo 12.10.2009 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:20 Mo 12.10.2009 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|