Verfasst am: 03.11.2015, 17:01
Titel: DGL mit Euler-Verfahren
Hallo alle,
ich hänge an einer Aufgabe fest und finde meinen Fehler nicht. Aufgabenstellung wie folgt:
Löse eine einfache DGL f'(x) = f(x) mit dem Euler-Verfahren. Betrachte verschiedene Funktionen (z.B. f(x) = -rx, f(x) = x^a, f(x) = sin(x), f(x) =
x(1 - x), f(x) = x + t) und trage die Lösung graphisch auf. Auch für verschiedene Schrittweiten. Vergleiche mit der analytischen Lösung und mit Matlabroutine ode45.
ich habe jetzt folgendes geschrieben:
Code:
function numsimulation(t0, t_end, delta_t, x0, fun)
% erwartet die intervallgrenzen t0, t_end, die schrittweite % delta_t, anfangswert x0 an der stelle t0 und eine anonyme funktion fun. % t0 muss kleiner als t_end sein. zeichnet die iterationsschritte
figure() while t0(end) < t_end
t0 = [t0, t0(end) + delta_t];
x0 = [x0, x0(end) + fun(x0(end))*delta_t];
end plot(t0, x0, '-o', 'MarkerSize', 3); xlabel('t_i'); ylabel('Funktionswerte'); title(['Näherung einer Funktion mit dem Euler-Verfahren - Startwert ', num2str(x0(1))]);
% und das hauptskript:
fun = cell(1,5); % anonyme funktionen in einem cell array speichern, für die for schleife später
r = 3;
fun{1} = @(x) -r*x;
a = 2;
fun{2} = @(x) x.^a;
fun{3} = @(x)sin(x);
fun{4} = @(x) x.*(1-x);
t = -4;
fun{5} = @(x) x + t;
delta_t = [0.1, 0.5, 1.5]; % verschiedene schrittweiten speichern for k = 1:3
t = delta_t(k);
for i = 1:5
numsimulation(0, 3, t, 5, fun{i}) hold on
x = 0:0.1:3;
if i == 1 plot(x, (-3/2)*x.^2 + 5, 'r')% plotte analytische lösung [T,Y] = ode45(@(t,y)-3*t, [0, 3], 5); % verwende ode45 solver plot(T, Y, 'y') elseif i == 2 plot(x, 1/3*x.^3 + 5, 'r') [T,Y] = ode45(@(t,y) t^2, [0, 3], 5);
plot(T, Y, 'y') elseif i == 3 plot(x, -cos(x) + 6, 'r') [T,Y] = ode45(@(t,y)sin(t), [0, 3], 5);
plot(T, Y, 'y') elseif i == 4 plot(x, (1/2*x.^2 - 1/3*x.^3 + 5), 'r') [T,Y] = ode45(@(t,y) t*(1-t), [0, 3], 5);
plot(T, Y, 'y') else plot(x, (1/2*x.^2-4*x + 5), 'r') [T,Y] = ode45(@(t,y) t - 4, [0, 3], 5);
plot(T, Y, 'y') end hold off
end end
da die graphen des ode45 solvers mit denen meiner berechneten analytischen funktionen übereinstimmen (ist ja einfach nur das integral, oder?), gehe ich nicht davon aus, das da ein fehler ist. Die graphen, die durch das euler-verfahren entstehen, sehen aber seeeeehr anders aus.
Statt einer while-Schleife würde ich eine for-Schleife mit Indizierung wählen.
Grüße,
Harald
SarahSW1550
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 03.11.2015, 18:03
Titel:
Himmel!! Ja, natürlich! Was ein bescheuerter Fehler... und jetzt saß ich hier ne stunde und hab gesucht... Vielen Dank!!
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.