www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Matlab" - Matlab M-Editor
Matlab M-Editor < Matlab < Mathe-Software < Mathe < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Matlab M-Editor: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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




        
Bezug
Matlab M-Editor: Antwort
Status: (Antwort) fertig Status 
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

Bezug
                
Bezug
Matlab M-Editor: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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

Bezug
                        
Bezug
Matlab M-Editor: Antwort
Status: (Antwort) fertig Status 
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

Bezug
                                
Bezug
Matlab M-Editor: Frage (reagiert)
Status: (Frage) reagiert/warte auf Reaktion Status 
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

Bezug
                                        
Bezug
Matlab M-Editor: Idee
Status: (Antwort) fertig Status 
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

Bezug
                                                
Bezug
Matlab M-Editor: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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


Bezug
                                                        
Bezug
Matlab M-Editor: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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





Bezug
                                                                
Bezug
Matlab M-Editor: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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

Bezug
                                        
Bezug
Matlab M-Editor: zur Lösung...
Status: (Frage) reagiert/warte auf Reaktion Status 
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

Bezug
                                                
Bezug
Matlab M-Editor: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                                        
Bezug
Matlab M-Editor: Frage (überfällig)
Status: (Frage) überfällig Status 
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




Bezug
                                                                
Bezug
Matlab M-Editor: war doch richtig?
Status: (Antwort) fertig Status 
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

Bezug
                                                                        
Bezug
Matlab M-Editor: Frage (überfällig)
Status: (Frage) überfällig Status 
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


Bezug
                                                                                
Bezug
Matlab M-Editor: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                                                                        
Bezug
Matlab M-Editor: Frage (reagiert)
Status: (Frage) reagiert/warte auf Reaktion Status 
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.





Bezug
                                                                                                
Bezug
Matlab M-Editor: Antwort
Status: (Antwort) fertig Status 
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

Bezug
                                                                                                        
Bezug
Matlab M-Editor: Frage (reagiert)
Status: (Frage) reagiert/warte auf Reaktion Status 
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


Bezug
                                                                                                                
Bezug
Matlab M-Editor: Antwort
Status: (Antwort) fertig Status 
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 [daumenhoch]

> 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

Bezug
                                                                                                                        
Bezug
Matlab M-Editor: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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

Bezug
                                                                                
Bezug
Matlab M-Editor: Fälligkeit abgelaufen
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 16:20 Mo 12.10.2009
Autor: matux

$MATUXTEXT(ueberfaellige_frage)
Bezug
                                                                
Bezug
Matlab M-Editor: Fälligkeit abgelaufen
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 11:20 Mo 12.10.2009
Autor: matux

$MATUXTEXT(ueberfaellige_frage)
Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]