Praktikum 4 a - Genauigkeit

Mr.B
Mausschubser
Mausschubser
Beiträge: 65
Registriert: 13. Dez 2009 17:04

Praktikum 4 a - Genauigkeit

Beitrag von Mr.B » 13. Jan 2011 00:23

Hey,

so wie ich das verstanden habe, sollen wir in jedem Durchlauf einen Zeilenvektor mit tk und xk in die Matrix X eintragen.
Das sähe dann nach dem ersten Schritt mit Schrittweite 0.1 und der gegeben Funktion beam so aus:

Code: Alles auswählen

  Columns 1 through 5
         0         0         0         0         0
    0.1000         0         0         0         0
  Columns 6 through 10
         0         0         0         0         0
         0         0         0         0         0
  Columns 11 through 15
         0         0         0         0         0
         0         0         0         0         0
  Columns 16 through 17
         0         0
         0         0
An erster stelle steht tk und danach xk stelle 1-16.

Soweit so gut....lass ich die Funktion weiterlaufen, sieht das bis k = 5, was tk angeht, gut aus, bei k=6 verschiebt Matlab allerdings die Mantisse und Passt den Exponenten auf 1*10^3 an, das sieht so aus:

Code: Alles auswählen

  1.0e+003 *
  Columns 1 through 5
         0         0         0         0         0
    0.0001         0         0         0         0
    0.0002         0         0         0         0
    0.0003    0.0000   -0.0000   -0.0000   -0.0000
    0.0004    0.0000   -0.0000   -0.0000   -0.0000
    0.0005   -0.0000    0.0000   -0.0000   -0.0000
    0.0006   -0.0000    0.0000   -0.0000    0.0000
  Columns 6 through 10
         0         0         0         0         0
         0         0         0         0         0
         0         0         0         0    0.0000
   -0.0000   -0.0000    0.0000    0.0000    0.0000
    0.0000   -0.0000    0.0000    0.0001   -0.0000
   -0.0000   -0.0008    0.0023   -0.0028   -0.0000
   -0.0000   -0.0062    0.0194   -0.0253   -0.0000
  Columns 11 through 15
         0         0         0         0         0
         0         0         0         0         0
   -0.0000   -0.0000   -0.0000   -0.0000   -0.0000
   -0.0000   -0.0000   -0.0000    0.0000   -0.0000
    0.0000   -0.0000   -0.0000   -0.0000   -0.0078
    0.0000   -0.0000    0.0000   -0.0000   -0.0546
    0.0000   -0.0000    0.3211    0.9202   -2.6615
  Columns 16 through 17
         0         0
         0         0
    0.0000    0.0002
    0.0000    0.0009
    0.0235   -0.0287
    0.1707   -0.2257
   -2.6203    2.7276
So, jetzt kommt der problematische Schritt, bei k=7 wird der Exponent wieder erhöht und die Mantisse fällt, weil es nur 4 Nachkommastellen gibt, weg:

Code: Alles auswählen

  1.0e+006 *
  Columns 1 through 5
         0         0         0         0         0
    0.0000         0         0         0         0
    0.0000         0         0         0         0
    0.0000    0.0000   -0.0000   -0.0000   -0.0000
    0.0000    0.0000   -0.0000   -0.0000   -0.0000
    0.0000   -0.0000    0.0000   -0.0000   -0.0000
    0.0000   -0.0000    0.0000   -0.0000    0.0000
    0.0000   -0.0000    0.0000   -0.0000    0.0000
  Columns 6 through 10
         0         0         0         0         0
         0         0         0         0         0
         0         0         0         0    0.0000
   -0.0000   -0.0000    0.0000    0.0000    0.0000
    0.0000   -0.0000    0.0000    0.0000   -0.0000
   -0.0000   -0.0000    0.0000   -0.0000   -0.0000
   -0.0000   -0.0000    0.0000   -0.0000   -0.0000
    0.0001   -0.0003   -0.0002    0.0002    0.0000
  Columns 11 through 15
         0         0         0         0         0
         0         0         0         0         0
   -0.0000   -0.0000   -0.0000   -0.0000   -0.0000
   -0.0000   -0.0000   -0.0000    0.0000   -0.0000
    0.0000   -0.0000   -0.0000   -0.0000   -0.0000
    0.0000   -0.0000    0.0000   -0.0000   -0.0001
    0.0000   -0.0000    0.0003    0.0009   -0.0027
   -0.0000    0.0000    0.0029    0.0710    0.6681
  Columns 16 through 17
         0         0
         0         0
    0.0000    0.0000
    0.0000    0.0000
    0.0000   -0.0000
    0.0002   -0.0002
   -0.0026    0.0027
   -1.4942    1.0521
Somit terminiert die berechnung niemals da tk niemals gleich tf ist....

Was mache ich Falsch, habe ich das mit der Zeilennotation falsch verstanden?

Bitte helft mir, ich weiß nicht wie ich das umgehen soll solange ich die Aufgabenstellung richtig verstanden habe :oops:

mister_tt
Kernelcompilierer
Kernelcompilierer
Beiträge: 502
Registriert: 29. Sep 2008 15:54

Re: Praktikum 4 a - Genauigkeit

Beitrag von mister_tt » 13. Jan 2011 09:34

Mr.B hat geschrieben:Somit terminiert die berechnung niemals da tk niemals gleich tf ist....
Ja das darf/kann natürlich nicht sein... Benutzt du auch eine "einfache" for-Schleife a la:
for tk_plus=t0+h:h:tf,
% code
end
? Funzt bei mir einwandfrei...

Mr.B
Mausschubser
Mausschubser
Beiträge: 65
Registriert: 13. Dez 2009 17:04

Re: Praktikum 4 a - Genauigkeit

Beitrag von Mr.B » 13. Jan 2011 15:05

Meine Schleife sieht so aus:

Code: Alles auswählen

while(X(k-1,1) ~= tf)
%code
end
Wobei X(k-1,1) immer der zuletzt errechnete Zeitwerts also im eigentlichen Sinne tk, ist.

Wenn ich debugge funktioniert dass eigentlich auch so wie ich will, allerdings ist tk ab k=7 wie im letzten Post beschrieben dann 0 wegen der Verschiebung der Mantisse.
Ich würde ja eigentlich sagen Matlab behällt sich schon einige Stellen mehr als die vier die man sehen kann...allerdings müsste es ja dann irgentwann mal terminieren :|
Mein Lösungsansatz wäre jetzt einen Seperaten "Zähler" für tk einzuführen, was ich allerdings für unnötig halte da tk ja sowieso in jedem Schritt in X gespeichert wird :wink:

Mr.B
Mausschubser
Mausschubser
Beiträge: 65
Registriert: 13. Dez 2009 17:04

Re: Praktikum 4 a - Genauigkeit

Beitrag von Mr.B » 13. Jan 2011 15:17

Ok, ich hab gerade mal eine extra Variable für tk gespendet....siehe da, das Problem scheint ein anderes zu sein. :oops:
Ich war schon etwas verwundert das Matlab einfach so Werte "verschwinden" lässt^^

Wenn ich also bis zur "Abbruchsstelle" debugge erhalte ich das:

Code: Alles auswählen

while(1.000 ~= 1)
%code
end
Anscheinend ist (double 1.000) ungleich (double 1) und damit bricht er an dieser Stelle nicht ab wie er sollte :wink:
Eine Idee wie ich das verhindern kann ohne mein Schleifenkonstrukt großartig abzuändern?

Achja...danke erstmal :D

mister_tt
Kernelcompilierer
Kernelcompilierer
Beiträge: 502
Registriert: 29. Sep 2008 15:54

Re: Praktikum 4 a - Genauigkeit

Beitrag von mister_tt » 13. Jan 2011 15:21

Steht die 1 in der while-Bedingung fest in deinem Code? Wenn ja, schreib doch mal 1.0 hin, damits als float interpretiert wird... Ansonsten multipliziere mit 1.0, damit es als float interpretiert wird...

Mr.B
Mausschubser
Mausschubser
Beiträge: 65
Registriert: 13. Dez 2009 17:04

Re: Praktikum 4 a - Genauigkeit

Beitrag von Mr.B » 13. Jan 2011 15:35

Nein, im Code steht

Code: Alles auswählen

while(tk ~= tf)
tf ist in meinem Bsp 1.

Ich habe das mal mit dem Interpreter geprüft und siehe da (1.000 == 1) liefert 1 und (1.000 ~= 1) liefert 0.
Somit müsste er eigentlich abbrechen, das ist mir unerklärlich.....ich will mich davon jetzt allerdings auch nicht länger aufhalten lassen und habe es mit for-Schleife implemnetiert, das funktioniert :|

Falls noch jemand eine Ahnung hat warum die while Methode nicht funktioniert hat, würde ich mich trotzdem darüber freuen :-)

Das Multiplizieren mit 1.0 habe ich jetzt nicht mehr ausprobiert, allerdings kann ich sagen, dass wenn ich mir die Werte beim Debuggen angeguckt habe das immer inetwa so aussah:

Code: Alles auswählen

while((double 1.000) ~= (double 1))
Dass also auch bei der 1 ein Double davor stand, somit müsste die 1 also auch als Double gespeichert sein und 1 gleich 1.000 sein :roll:

Benutzeravatar
paddy_hawk
Nichts ist wie es scheint
Beiträge: 23
Registriert: 24. Okt 2007 14:11

Re: Praktikum 4 a - Genauigkeit

Beitrag von paddy_hawk » 15. Jan 2011 21:26

Sehe ich das falsch oder ist X beim Test von Aufgabe a) eine Matrix mit 50000 Zeilen und 17 Spalten (oder vllt andersrum?)?

Weil Schrittweite ist 0.0001 und wir gehen von t0=0 bis tf=5.

Das dauert bei mir erstens sehr lange, zweitens kommt die Meldung, dass die Abweichung zu stark ist. Aber wenn ich die Schrittweite auf 0.001 erhöhe, dann funktioniert es und der Test läuft durch....

Mach ich irgendwas grundlegend falsch?

Bitte um Hilfe;-)

mister_tt
Kernelcompilierer
Kernelcompilierer
Beiträge: 502
Registriert: 29. Sep 2008 15:54

Re: Praktikum 4 a - Genauigkeit

Beitrag von mister_tt » 16. Jan 2011 08:30

paddy_hawk hat geschrieben:Sehe ich das falsch oder ist X beim Test von Aufgabe a) eine Matrix mit 50000 Zeilen und 17 Spalten (oder vllt andersrum?)?
Klingt gut. Und zwar die erste Variante.
paddy_hawk hat geschrieben:Das dauert bei mir erstens sehr lange
Bei mir auch. Das explizite EV ist ja jetzt auch nicht gerade State of the art ^^ Deshalb braucht man ne sehr kleine Schrittweite wie hier und damit dauert es dann einfach lang...
paddy_hawk hat geschrieben:, zweitens kommt die Meldung, dass die Abweichung zu stark ist. Aber wenn ich die Schrittweite auf 0.001 erhöhe, dann funktioniert es und der Test läuft durch....
Dann hast du da wohl noch einen Fehler drin ^^

Antworten

Zurück zu „Archiv“