|
Autor |
Radau-IA-Verfahren |
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Themenstart: 2021-11-05
|
Hallo zusammen, Ich habe diese Programmierungsaufgabe:
https://www.matheplanet.com/matheplanet/nuke/html/uploads/b/54010_Unbenatztftfulkhlnnt.PNG
Die erste Formel muss ich als Code schreiben
https://www.matheplanet.com/matheplanet/nuke/html/uploads/b/54010_Unbenalukhghtjfgjhnnt.PNG
z_j muss in die Differentialgleichung eingesetzt werden dann habe ich so
z_1*(-1/2).
Meine Frage ist wie kann ich eine Variable einsetzten? in diesem Fall y durch z_1 oder z_2 ersetzen. Ich kann eine Zahl einsetze aber eine Buchstabe(Variable) nicht
Mein bisheriger Code:
\sourceon Matlab
c = [0,2/3];
a = [1/4,-1/4;1/4,5/12];
b = [1/4,3/4];
s = 2;
y0=1;
f = @(x,y) (-y/2);
h=0.1;
x(1) = 0;
for i = 1 : s
for j = 1 : s
z(i) = y0 + h * (sum(a(i,j)*f(x(1)+c(j)*h,z(j))))
end
end
\sourceoff
aber ich habe fehler bei z(j).
Ich wäre dankbar, wenn jemand mir helfen würde.
|
Profil
|
Delastelle
Senior  Dabei seit: 17.11.2006 Mitteilungen: 2306
 | Beitrag No.1, eingetragen 2021-11-06
|
Hallo s-amalgh!
Eventuell kannst Du erst mal mit einem noch einfacheren Beispiel
anfangen. Z.B. mit dem impliziten Euler-Verfahren.
Wenn es läuft, dann das Radau-Verfahren (2 Stufig).
So auf den ersten Blick habe ich nicht gesehen, wo der Fehler liegt!
Viele Grüße
Ronald
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.2, vom Themenstarter, eingetragen 2021-11-06
|
Danke erstmal für deine Antwort :)
Das hat nicht mit einem bestimmten Verfahren zu tun..
https://www.matheplanet.com/matheplanet/nuke/html/uploads/b/54010_Unbenalukhguguguhtjfgjhnnt.PNG
Ich muss f(x0 + c_j*h, z_j) in -y/2 einsetzen dann habe ich -z_j/2 (es gibt kein x in -y/2).
Ich konnte aber nicht y durch z_j ersetzen
Wahrscheinlich durch den Code der ich geschrieben habe kann ich y durch irgendeine Zahl ersetzen und nicht durch eine Buchstabe..
Hast du Idee wie ich das machen kann?
Vielen Dank im Voraus!
|
Profil
|
Delastelle
Senior  Dabei seit: 17.11.2006 Mitteilungen: 2306
 | Beitrag No.3, eingetragen 2021-11-06
|
Hallo,
Ich selbst habe bisher fast nie mit impliziten Verfahren für Anfangswertprobleme gearbeitet.
Eventuell gibt es hier Code und Beispiele:
https://de.mathworks.com/matlabcentral/fileexchange/56162-radau-iia
Ich kann auch mal in Büchern schauen, vielleicht finde ich was!
Viele Grüße
Ronald
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.4, vom Themenstarter, eingetragen 2021-11-06
|
Ja das wäre sehr nett von dir wenn du an Bücher für mich gucken würdest :)
Ich konnte die Datei nicht aufmachen , könntest du bitte den Code kopieren und hier einfügen?
|
Profil
|
Delastelle
Senior  Dabei seit: 17.11.2006 Mitteilungen: 2306
 | Beitrag No.5, eingetragen 2021-11-06
|
Hallo,
ich selbst bin bei Mathworks nicht angemeldet.
Vieleicht schaut jemand vorbei, der schon angemeldet ist.
Oder Du meldest Dich selbst an.
Viele Grüße
Ronald
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.6, eingetragen 2021-11-06
|
Du missverstehst, was die sum-Funktion leistet. Bei dir ist das Argument dieser Funktion eine Zahl und sum liefert folglich die Summe dieser einen Zahl, also die Zahl selbst.
Statt sum zu verwenden solltest du die Summation in deiner Schleife über j selbst ausführen, etwa so:
\sourceon matlab
for i = 1 : s
z(i) = 0
for j = 1 : s
z(i) = z(i) + a(i,j) * f(x(1) + c(j) * h, z(j))
end
z(i) = y0 + h * z(i)
end
\sourceoff
Die Summe zur Berechnung von y1 kannst du analog ausführen, und zwar auch innerhalb dieser Doppelschleife.
--zippy
[Die Antwort wurde nach Beitrag No.4 begonnen.]
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.7, eingetragen 2021-11-06
|
\quoteon(2021-11-06 01:07 - Delastelle in Beitrag No. 5)
ich selbst bin bei Mathworks nicht angemeldet.
Vieleicht schaut jemand vorbei, der schon angemeldet ist.
Oder Du meldest Dich selbst an.
\quoteoff
Man muss nicht angemeldet sein, um den Code lesen zu können. Einfach im Reiter "Functions" auf "radau" klicken.
Ich möchte aber bezweifeln, dass einem eine fertige Funktion, die aus fast 2.000 Zeilen besteht, bei der Lösung dieser simplen Programmieraufgabe weiterhilft.
|
Profil
|
Delastelle
Senior  Dabei seit: 17.11.2006 Mitteilungen: 2306
 | Beitrag No.8, eingetragen 2021-11-06
|
Hallo,
zum Buch
Faires / Burden "Numerische Methoden" soll es auch Software
geben - damals (1994) eine Diskette.
Als Adresse ist www.spektrum-verlag.com angegeben - dies führt aber
im Jahr 2021 zu Springer. Ich habe jetzt bei mir auch den Quellcode auf der Festplatte wieder gefunden.
Viele Grüße
Ronald
Edit:
@zippy
manchmal helfen aber fertige Programme um eigene Fehler zu finden.
In der Optimierung / Numerik sind die eigentlichen Routinen oft kurz.
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.9, vom Themenstarter, eingetragen 2021-11-06
|
Danke für deine Antwort
Ich habe versucht erstmal das mathematisch zu lösen und ich habe das so raus gekommen:
https://www.matheplanet.com/matheplanet/nuke/html/uploads/b/54010_08af1d16-27c7-4ac5-80c3-b3753d31c1f1.jpg
Falsche Lösung?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.10, eingetragen 2021-11-06
|
\quoteon(2021-11-06 01:33 - Delastelle in Beitrag No. 8)
@zippy
manchmal helfen aber fertige Programme um eigene Fehler zu finden.
\quoteoff
Was zu programmieren ist, steht doch schon in den zwei Formeln im Startbeitrag. Es geht nur noch darum, diese beiden Formeln in matlab-Code zu übesetzen.
\quoteon(2021-11-06 01:33 - Delastelle in Beitrag No. 8)
In der Optimierung / Numerik sind die eigentlichen Routinen oft kurz.
\quoteoff
Wie schon gesagt: 2.000 Zeilen
[Die Antwort wurde nach Beitrag No.8 begonnen.]
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.11, eingetragen 2021-11-06
|
\quoteon(2021-11-06 01:38 - s-amalgh in Beitrag No. 9)
Falsche Lösung?
\quoteoff
EDIT: Nach dem Zitat deines Dozenten könnte tatsächlich gemeint sein, dass man das vorher auf dem Papier ausrechnet, vgl. Beitrag Nr. 18.
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.12, vom Themenstarter, eingetragen 2021-11-06
|
Ich muss lineares Gleichungssystem von z_1 und z_2 haben das steht in der Aufgabe
Aber ich glaube dein Code liefert kein lineares Gleichungssystem oder?
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.13, vom Themenstarter, eingetragen 2021-11-06
|
Ich habe das ausgeführt
\sourceon Matlab
function tt
c = [0,2/3];
a = [1/4,-1/4;1/4,5/12];
b = [1/4,3/4];
s = 2;
y0=1;
f = @(x,y) (-y/2);
h=0.1;
x(1) = 0;
for i = 1 : s
z(i) = 0
for j = 1 : s
z(i) = z(i) + a(i,j) * f(x(1) + c(j) * h, z(j))
end
z(i) = y0 + h * z(i)
end
end
\sourceoff
und habe das rausgekommen:
z = 0
z = 0
error: z(2): out of bound 1 (dimensions ar
e 1x1)
error: called from
tt at line 14 column 12
Das ist die 14.Zeile
\sourceon Matlab
z(i) = z(i) + a(i,j) * f(x(1) + c(j) * h, z(j))
\sourceoff
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.14, eingetragen 2021-11-06
|
\quoteon(2021-11-06 01:52 - s-amalgh in Beitrag No. 13)
error: z(2): out of bound 1 (dimensions ar
e 1x1)
\quoteoff
z muss vor der Doppelschleife definiert werden, etwa so:
\sourceon matlab
function tt
c = [0,2/3];
a = [1/4,-1/4;1/4,5/12];
b = [1/4,3/4];
s = 2;
y0=1;
f = @(x,y) (-y/2);
h=0.1;
x(1) = 0;
z = [0, 0]
for i = 1 : s
for j = 1 : s
z(i) = z(i) + a(i,j) * f(x(1) + c(j) * h, z(j))
end
z(i) = y0 + h * z(i)
end
end
\sourceoff
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.15, eingetragen 2021-11-06
|
\quoteon(2021-11-06 01:50 - s-amalgh in Beitrag No. 12)
Aber ich glaube dein Code liefert kein lineares Gleichungssystem oder?
\quoteoff
Nein, ich habe bisher nur das Problem mit der sum-Funktion betrachtet, sonst aber deinen Code beibehalten.
Was hier noch nicht passt, ist, dass die Formel (2.16) im Startbeitrag ein Gleichungssystem zwischen den $z_j$ beschreibt, während der Code die bisher nicht berechneten $z_j$ auf der rechten Seite einfach durch $0$ ersetzt.
Um hier zu dem in der Aufgabenstellung angesprochenen linearen Gleichungssystem zu kommen, muss man auch ausnutzen, dass $f(x,y)$ in $y$ linear ist.
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.16, vom Themenstarter, eingetragen 2021-11-06
|
Ich verstehe zwei sachen nicht
die erst : In der Aufgabestellung steht "sind hier lineare Gleichungssysteme zu lösen" z_i (also z_1 und z_2) stellen ein lineares Gleichungssystem dar und dann muss ich das lösen. Und eigentlich der Dozent hat mir so geschrieben : "schreiben Sie die beiden Gleichungen mit z_1, z_2 explizit auf und setzen Sie alles ein, was aus der Aufgabe bekannt ist. Sie sollten ein lineares Gleichungssystem für z_1, z_2 herausbekommen. Eventuell müssen Sie das z_i noch auf die andere Seite bringen, dann können Sie das LGS lösen."
die zweite: In der ersten Schleife hast du entschieden dass z_j (z_1) gleich 0 ist aber das wissen wir nicht. wir verwenden die erste Formel um z_1 und z_2 zu bestimmen
[Die Antwort wurde nach Beitrag No.14 begonnen.]
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.17, vom Themenstarter, eingetragen 2021-11-06
|
Wie kann ich ein lineares Gleichungssystem von z_1 und z_2 stellen? Hast du idee?
Ich glaube y sollte einfach durch z_1 und dann z_2 ersetzt und nicht durch 0
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.18, eingetragen 2021-11-06
|
\quoteon(2021-11-06 02:31 - s-amalgh in Beitrag No. 17)
Wie kann ich ein lineares Gleichungssystem von z_1 und z_2 stellen?
\quoteoff
Die Formel (2.16) ist doch bereits ein lineares Gleichungssystem für die $z_i$.
Die Frage ist, wo dieses System zu lösen ist: Im Programm oder vorher auf dem Papier. Das Zitat deines Dozenten in Beitrag Nr. 16 klingt fast so, als sei tatsächlich die Papierlösung gemeint, aber eindeutig ist das nicht.
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.19, vom Themenstarter, eingetragen 2021-11-06
|
Achso ok
Aber was ich nicht verstehe ist, wie haben wir in der ersten Runde z_j(also z_1) durch 0 ersetzt und wir wollten z_1 noch bestimmen?
Ich meinte die Gleichung war so : z_1 = ........... f(x0 + c_j*h, z_1)
wir wollten z_1 noch bestimmen aber du hast z_1 das in der rechten Seite steht der Wert 0 gegeben
Könntest du mir bitte erklären wieso ?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.20, eingetragen 2021-11-06
|
\quoteon(2021-11-06 03:44 - s-amalgh in Beitrag No. 19)
aber du hast z_1 das in der rechten Seite steht der Wert 0 gegeben
Könntest du mir bitte erklären wieso ?
\quoteoff
Nur deswegen:
\quoteon(2021-11-06 02:21 - zippy in Beitrag No. 15)
Nein, ich habe bisher nur das Problem mit der sum-Funktion betrachtet, sonst aber deinen Code beibehalten.
\quoteoff
Um jetzt das Gleichungssystem zu lösen (und zwar nicht auf dem Papier, sondern im Programm), ist die Formel (2.16) zuerst in die Form $\sum_j m_{ij}\,z_j=b_i$ zu bringen. Wenn die hier auftretende Matrix $m$ und der Vektor $b$ unter gleichem Namen in Matlab angelegt sind, kann man dort einfach $z=m\backslash b$ schreiben.
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.21, vom Themenstarter, eingetragen 2021-11-06
|
aber wir haben schon z_i oder?
\sourceon Matlab
function tt
c = [0,2/3];
a = [1/4,-1/4;1/4,5/12];
b = [1/4,3/4];
s = 2;
y0=1;
f = @(x,y) (-y/2);
h=0.1;
x(1) = 0;
z = [0, 0];
for i = 1 : s
for j = 1 : s
z(i) = z(i) + a(i,j) * f(x(1) + c(j) * h, z(j))
end
z(i) = y0 + h * z(i)
end
end
\sourceoff
Ausgabe:
z =
0 0
z =
0 0
z =
1 0
z =
1.0000 -0.1250
z =
1.000000 -0.098958
z =
1.0000 0.9901
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.22, vom Themenstarter, eingetragen 2021-11-06
|
Und noch eine Frage
Meinst du a mit m ?
a = [1/4,-1/4;1/4,5/12];
b = [1/4,3/4];
z=a\b, so?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.23, eingetragen 2021-11-06
|
\quoteon(2021-11-06 04:57 - s-amalgh in Beitrag No. 21)
aber wir haben schon z_i oder?
\quoteoff
Ja, aber das ist keine Lösung des Gleichungssystems.
\quoteon(2021-11-06 05:01 - s-amalgh in Beitrag No. 22)
Meinst du a mit m ?
\quoteoff
Nein, die beiden Matrizen unterscheiden sich in einem wesentlichen Punkt:
\quoteon(2021-11-06 02:28 - s-amalgh in Beitrag No. 16)
Eventuell müssen Sie das z_i noch auf die andere Seite bringen, dann können Sie das LGS lösen."
\quoteoff
Ich habe mal die Umsetzung der Formel (2.16) skizziert. Das "z_i auf die andere Seite bringen" findet sich in Zeile 20 wieder. Aber Vorsicht, ich habe diesen Code nur runtergeschrieben und nicht getestet.
\sourceon matlab
\numberson
% wir betrachten nur Funktionen f(x, y), die linear in
% y sind und setzen f(x, y) = f(x)(1) + f(x)(2) * y
f = @(x) [0, -1/2];
step(0, 1, .01, f)
function [x1, y1] = step(x0, y0, h, f)
a = [1/4, -1/4; 1/4, 5/12];
b = [1/4, 3/4];
c = [0, 2/3];
z = zeros(2, 1);
m = zeros(2);
for i = 1 : 2
for j = 1 : 2
u = f(x0 + h * c(j));
z(i) = z(i) + a(i, j) * u(1);
m(i, j) = h * a(i, j) * u(2);
end
z(i) = y0 + h * z(i);
m(i, i) = m(i, i) - 1;
end
z = -m\z;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% hier kommt jetzt die Umsetzung %%
%% der Formel zur Berechnung von y1 %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x1 = x0 + h;
end
\sourceoff
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.24, vom Themenstarter, eingetragen 2021-11-06
|
so vielleicht ?
\sourceon Matlab
function tt
% wir betrachten nur Funktionen f(x, y), die linear in
% y sind und setzen f(x, y) = f(x)(1) + f(x)(2) * y
f = @(x) [0, -1/2];
step(0, 1, 0.1, f)
function [x1, y1] = step(x0, y0, h, f)
a = [1/4, -1/4; 1/4, 5/12];
b = [1/4, 3/4];
c = [0, 2/3];
z = zeros(2, 1);
m = zeros(2);
for i = 1 : 2
for j = 1 : 2
u = f(x0 + h * c(j))
z(i) = z(i) + a(i, j) * u(1)
m(i, j) = h * a(i, j) * u(2)
end
z(i) = y0 + h * z(i)
m(i, i) = m(i, i) - 1
end
z = -m\z
for i = 1 : 2
y1 = b(i) * f(x0 + c(i) * h, z(i));
y1 = y0 + h * y1
end
#x1 = x0 + h;
end
end
\sourceoff
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.25, eingetragen 2021-11-06
|
\quoteon(2021-11-06 16:25 - s-amalgh in Beitrag No. 24)
so vielleicht ?
\quoteoff
Nicht ganz:
1. Du berücksichtigst nicht, dass $f$ so als Matlab-Funktion definiert ist, dass man die lineare Abhängigkeit von $y$ ausnutzen kann.
2. y0 muss genau einmal zu y1 addiert werden. Die Addition darf daher nicht innerhalb der Schleife erfolgen.
\sourceon Matlab
function [x1, y1] = step(x0, y0, h, f)
a = [1/4, -1/4; 1/4, 5/12];
b = [1/4, 3/4];
c = [0, 2/3];
z = zeros(2, 1);
m = zeros(2);
for i = 1 : 2
for j = 1 : 2
u = f(x0 + h * c(j));
z(i) = z(i) + a(i, j) * u(1);
m(i, j) = h * a(i, j) * u(2);
end
z(i) = y0 + h * z(i);
m(i, i) = m(i, i) - 1;
end
z = -m\z
x1 = x0 + h;
y1 = 0;
for i = 1 : 2
u = f(x0 + h * c(i));
y1 = b(i) * (u(1) + u(2) * z(i));
end
y1 = y0 + h * y1 ;
end
end
\sourceoff
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.26, vom Themenstarter, eingetragen 2021-11-06
|
Achso ok alles klar.
Ich versuche jetzt die y2,.......,yn zu bestimmen für h= 0.1, 0.05, 0.01, 0.005, 0.001
Ich melde mich wenn ich das nicht hinkriege :)
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.27, vom Themenstarter, eingetragen 2021-11-06
|
Mein Code :
\sourceon Matlab
function tt
% wir betrachten nur Funktionen f(x, y), die linear in
% y sind und setzen f(x, y) = f(x)(1) + f(x)(2) * y
f = @(x) [0, -1/2];
[x,y] = step(0, 1, 1, 0.1, f)
function [x,y] = step(a_, b_, y0, h, f)
x(1) = a_;
a = [1/4, -1/4; 1/4, 5/12];
b = [1/4, 3/4];
c = [0, 2/3];
z = zeros(2, 1);
m = zeros(2);
n = ( b_ - a_ ) /h ;
y(:,1) = y0(:);
for k = 1 : n
for i = 1 : 2
for j = 1 : 2
u = f(x(k) + h * c(j));
z(i) = z(i) + a(i, j) * u(1);
m(i, j) = h * a(i, j) * u(2);
end
z(i) = y(:,k) + h * z(i);
m(i, i) = m(i, i) - 1;
end
z = -m\z;
x(k + 1) = x(k) + h;
for i = 1 : 2
u = f(x(k) + h * c(i));
y(:,k+1) = b(i) * (u(1) + u(2) * z(i));
end
y(:,k+1) = y(:,k) + h * y(:,k+1);
end
end
end
\sourceoff
Die Ausgabe :
x =
Columns 1 through 7:
0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000
Columns 8 through 11:
0.7000 0.8000 0.9000 1.0000
y =
Columns 1 through 7:
1.0000 0.9637 0.9253 0.8880 0.8522 0.8178 0.7848
Columns 8 through 11:
0.7531 0.7228 0.6936 0.6656
Richtig oder?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.28, eingetragen 2021-11-06
|
\quoteon(2021-11-06 21:01 - s-amalgh in Beitrag No. 27)
Columns 8 through 11:
0.7531 0.7228 0.6936 0.6656
Richtig oder?
\quoteoff
0.7047 0.6703 0.6376 0.6065
sind die Werte der exakten Lösung, das kommt also so ungefähr hin.
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.29, vom Themenstarter, eingetragen 2021-11-06
|
Dann sollte meine Lösung richtig sein oder
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.30, vom Themenstarter, eingetragen 2021-11-06
|
Ich muss jetzt die globalen Fehler der Methode bei x = 1
Die Definition davon ist :
https://www.matheplanet.com/matheplanet/nuke/html/uploads/b/54010_Unbenavgfjdf_bgkjlgflbknnt.PNG
was sind y(x_N) und y_N in unserer Aufgabe? Hast du Idee?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.31, eingetragen 2021-11-06
|
\quoteon(2021-11-06 21:48 - s-amalgh in Beitrag No. 29)
Dann sollte meine Lösung richtig sein oder
\quoteoff
Mir scheinen die Abweichungen zu der exakten Lösung etwas zu groß zu sein.
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.32, vom Themenstarter, eingetragen 2021-11-06
|
\showon
Mir scheinen die Abweichungen zu der exakten Lösung etwas zu groß zu sein
\showoff
wieso ?
wo liegt das Fehler?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.33, eingetragen 2021-11-06
|
\quoteon(2021-11-06 22:55 - s-amalgh in Beitrag No. 32)
wieso ?
\quoteoff
Die Ergebnisse sind ja schlechter als die des Euler-Verfahrens $y_1 = y_0 + h\cdot f(x_0,y_0)$.
\quoteon(2021-11-06 22:55 - s-amalgh in Beitrag No. 32)
wo liegt das Fehler?
\quoteoff
In Zeile 21 fehlte ein y1.
\sourceon matlab
\numberson
function [x1, y1] = step(x0, y0, h, f)
a = [1/4, -1/4; 1/4, 5/12];
b = [1/4, 3/4];
c = [0, 2/3];
z = zeros(2, 1);
m = zeros(2);
for i = 1 : 2
for j = 1 : 2
u = f(x0 + h * c(j));
z(i) = z(i) + a(i, j) * u(1);
m(i, j) = h * a(i, j) * u(2);
end
z(i) = y0 + h * z(i);
m(i, i) = m(i, i) - 1;
end
z = -m\z;
x1 = x0 + h;
y1 = 0;
for i = 1 : 2
u = f(x0 + h * c(i));
y1 = y1 + b(i) * (u(1) + u(2) * z(i));
end
y1 = y0 + h * y1 ;
end
\sourceoff
Damit liefert
\sourceon matlab
x = 0; y = 1;
for n = 1 : 10
[x, y] = step(x, y, .1, f);
end
y
\sourceoff
y = 0.6065
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.34, vom Themenstarter, eingetragen 2021-11-06
|
Ich habe so rausgekommen:
y =
Columns 1 through 7:
1.0000 0.9512 0.9001 0.8512 0.8049 0.7611 0.7198
Columns 8 through 11:
0.6806 0.6436 0.6086 0.5755
Richtig jetzt oder?
Mein Code:
\sourceon Matlab
function tt
% wir betrachten nur Funktionen f(x, y), die linear in
% y sind und setzen f(x, y) = f(x)(1) + f(x)(2) * y
f = @(x) [0, -1/2];
[x,y] = step(0, 1, 1, 0.1, f)
function [x,y] = step(a_, b_, y0, h, f)
x(1) = a_;
a = [1/4, -1/4; 1/4, 5/12];
b = [1/4, 3/4];
c = [0, 2/3];
z = zeros(2, 1);
m = zeros(2);
n = ( b_ - a_ ) /h ;
y= zeros(length(y0),n+1);
y(:,1) = y0(:);
for k = 1 : n
for i = 1 : 2
for j = 1 : 2
u = f(x(k) + h * c(j));
z(i) = z(i) + a(i, j) * u(1);
m(i, j) = h * a(i, j) * u(2);
end
z(i) = y(:,k) + h * z(i);
m(i, i) = m(i, i) - 1;
end
z = -m\z;
x(k + 1) = x(k) + h;
for i = 1 : 2
u = f(x(k) + h * c(i));
y(:,k+1) = y(:,k+1) + b(i) * (u(1) + u(2) * z(i));
end
y(:,k+1) = y(:,k) + h * y(:,k+1);
end
end
end
\sourceoff
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.35, eingetragen 2021-11-07
|
\quoteon(2021-11-06 23:29 - s-amalgh in Beitrag No. 34)
Columns 1 through 7:
1.0000 0.9512 0.9001 0.8512 0.8049 0.7611 0.7198
Columns 8 through 11:
0.6806 0.6436 0.6086 0.5755
Richtig jetzt oder?
\quoteoff
Meine Ergebnisse sehen anders aus und sind deutlich näher an der exakten Lösung:
\quoteon(2021-11-06 23:29 - s-amalgh in Beitrag No. 34)
Mein Code:
\quoteoff
Warum vermischt du das Aufbauen der Zeitreihen mit der Berechnung des Schritts $y_0\to y_1$? Das macht den Code nur unnötig kompliziert.
Dass unsere Ergebnisse für den ersten Schritt (0.9512) noch übereinstimmen und erst danach auseinanderlaufen, ist ein starker Hinweis, dass dieses Vermischen die Ursache deines Fehlers ist.
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.36, vom Themenstarter, eingetragen 2021-11-07
|
Wie kann ich y0 bis yn berechnen um wie deine Ergebnisse zu bekommen?
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.37, vom Themenstarter, eingetragen 2021-11-07
|
Ich habe dein Code probiert
\sourceon Matlab
function tt
% wir betrachten nur Funktionen f(x, y), die linear in
% y sind und setzen f(x, y) = f(x)(1) + f(x)(2) * y
x = 0; y = 1;
for n = 1 : 10
[x, y] = step(x, y, .1, f);
end
y
function [x1, y1] = step(x0, y0, h, f)
a = [1/4, -1/4; 1/4, 5/12];
b = [1/4, 3/4];
c = [0, 2/3];
z = zeros(2, 1);
m = zeros(2);
for i = 1 : 2
for j = 1 : 2
u = f(x0 + h * c(j));
z(i) = z(i) + a(i, j) * u(1);
m(i, j) = h * a(i, j) * u(2);
end
z(i) = y0 + h * z(i);
m(i, i) = m(i, i) - 1;
end
z = -m\z:
x1 = x0 + h;
y1 = 0;
for i = 1 : 2
u = f(x0 + h * c(i));
y1 = y1 + b(i) * (u(1) + u(2) * z(i));
end
y1 = y0 + h * y1 ;
end
end
\sourceoff
aber kommt ein Fehler raus
x1 = x0 + h;
^
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 4607
 | Beitrag No.38, eingetragen 2021-11-07
|
\quoteon(2021-11-07 00:10 - s-amalgh in Beitrag No. 36)
Wie kann ich y0 bis yn berechnen um wie deine Ergebnisse zu bekommen?
\quoteoff
Ähnlich wie ich das in Beitrag Nr. 33 schon hingeschrieben hatte:
\sourceon matlab
x(1) = 0;
y(1) = 1;
for n = 1 : 10
[x(n+1), y(n+1)] = step(x(n), y(n), .1, @(x) [0, -1/2]);
end
\sourceoff
\sourceon matlab
\numberson
function [x1, y1] = step(x0, y0, h, f)
a = [1/4, -1/4; 1/4, 5/12];
b = [1/4, 3/4];
c = [0, 2/3];
z = zeros(2, 1);
m = zeros(2);
for i = 1 : 2
for j = 1 : 2
u = f(x0 + h * c(j));
z(i) = z(i) + a(i, j) * u(1);
m(i, j) = h * a(i, j) * u(2);
end
z(i) = y0 + h * z(i);
m(i, i) = m(i, i) - 1;
end
z = -m\z;
x1 = x0 + h;
y1 = 0;
for i = 1 : 2
u = f(x0 + h * c(i));
y1 = y1 + b(i) * (u(1) + u(2) * z(i));
end
y1 = y0 + h * y1 ;
end
\sourceoff
[Die Antwort wurde nach Beitrag No.36 begonnen.]
|
Profil
|
s-amalgh
Wenig Aktiv  Dabei seit: 16.12.2020 Mitteilungen: 374
 | Beitrag No.39, vom Themenstarter, eingetragen 2021-11-07
|
ja ich habe jetzt wie dein Ergebnis rausgekommen
y =
Columns 1 through 5:
1.0000 0.9512 0.9048 0.8607 0.8187
Columns 6 through 10:
0.7788 0.7408 0.7047 0.6703 0.6376
Column 11:
0.6065
|
Profil
|
|
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen. Lesen Sie die
Nutzungsbedingungen,
die Distanzierung,
die Datenschutzerklärung und das Impressum.
[Seitenanfang]
|