Verfasst am: 18.06.2012, 16:00
Titel: Randwertproblem - Wie komme ich an die Funktion heran?
Hi,
ich habe folgendes Problem:
Habe über den bvp4c-solver ein Randwertproblem erfolgreich gelöst. Allerdings brauche ich die Lösungsfunktion für ein neues Randwertproblem und ich finde einfach nicht, wie man aus dieser "sol"-Variable die Funktion als solches herausbekommt. Laut Hilfe-Funktion sei diese ja über sol.y ansprechbar, das hat allerdings bei mir jetzt nicht geklappt.
Um das ganze vielleicht zum besseren Verständnis noch mit Formeln zu untermalen:
(meine DGL). habe nun eine andre dgl:
und möchte darin mein vorher bestimmtes y(z) verwenden.
Der Code (bisher nur für das Lösen der ersten DGL):
Najo...
für den Fall, dass jemand mal dasselbe Problem haben sollte und wie ich keine Lösung dazu findet:
Die Lösung ist alles andre als elegant, ich glaube kaum, dass sie immer funktioniert und ich kann mir auch nicht vorstellen, dass es nicht irgendwie einfacher ginge...
Vorgehen: Die Funktion "interp1" auf die Wertetabelle anwenden, die der Solver zurückgibt. Hierbei erhält man eine Wertetabelle die einigermaßen gleich sein sollte, auf die man dann die "polyfit"-funktion loslassen kann. Keine Ahnung, wieso, aber wenn man polyfit auf die Wertetabelle, die der Solver ausspuckt, anwendet, kommt nur Müll raus. polyfit gibt nun eine Wertetabelle mit n Parametern zurück, mit denen man ein Polynom n-ter Ordnung beschreiben kann. Jetzt muss man sich eine Funktion schreiben, die das auswerten kann. Diese Funktion ist jetzt in der Lage explizit einen Wert für jedes beliebige x zurückzugeben. Die Fit-Funktion funktioniert natürlich auch nur zuverlässig auf dem Intervall, auf dem man die Näherungslösung der DGL ausrechnen lassen hat. Mit dieser Funktion kann man nun auch in weitere DGLn gehen und diese lösen. Das Verfahren muss auf die neuen Lösungen natürlich auch wieder angewandt werden.
%-----------------------------------------------------
function A = func_A (x,P)
A = 0;
for k = 1:length(P) sum = P(1,k)*x^(length(P)-k);
A = A + sum;
end % ------------------------------------------------------------ function dydx = mat4ode_A(x,y) global theta;
dydx = [y(2)
theta^2*y(1)];
% ------------------------------------------------------------ function dydx = mat4ode_B(x,y) global theta;
global coeff_A;
dydx = [y(2)
%theta^2*(-cosh(theta*x)/cosh(theta)+y(1))];
theta^2*(-func_A(x,coeff_A)+y(1))];
% ------------------------------------------------------------ function res = mat4bc_A(ya,yb)
res = [ ya(2)
yb(1)-1];
% ------------------------------------------------------------ function res = mat4bc_B(ya,yb)
res = [ ya(2)
yb(1)];
% ------------------------------------------------------------ function yinit = mat4init_A(x)
yinit = [1 0];
% ------------------------------------------------------------ function yinit = mat4init_B(x)
yinit = [0 1];
% ------------------------------------------------------------
ohne jetzt durch den ganzen Code durchzuschauen, ist mein Eindruck folgender:
Man bekommt bei der numerischen Lösung am Ende eine Lösung x und y, möchte aber eine Funktion haben. Meine Frage wäre dann sogleich: wozu eine Funktion?
Wenn man die Funktion nur auswerten möchte, bietet sich direkte Interpolation an:
Falls die Lösungskurve keinen polynomialen Verlauf aufweist, halte ich es für sehr gewagt, da irgendein Polynom durchzulegen und das dann als die Lösung zu betrachten. Man sollte sich schon den Lösungsverlauf ansehen und davon ausgehend eine Entscheidung treffen, wie das Modell aussehen sollte.
Vor allem aber: wenn du gerne eine Lösungsfunktion hättest, solltest du auch an einen symbolischen Ansatz (über DSOLVE) nachdenken.
Danke, der Tipp mit dem dsolve-command hat mir sehr weitergeholfen. Das ist eigentlich genau,was ich wollte. Kann ich mir den ganzen Umweg in meiner Lösung sparen. Allerdings habe ich dabei auch feststellen müssen, dass dsolve deutlich weniger performant ist. Rechnet sicher 3-4x so lange.
Das selbe Problem habe ich auch. Ich komme nicht an die Lösung des bvp4c sovlers ran. So wie ich das verstanden habe, berechnet der bvp4c solver eine Näherungslösung S(x), die auf jedem Subinterval im Interval des eigentlichen Randwertproblems ein kubisches Polynom darstellt, mittels einer Kolokationsmethode. Die Rückgabe des bvp4c solvers beinhaltet aber nicht die einzelnen Näherungslösungen (kubischen Polynome), die ich gerne zur weiteren Bearbeitung hätte sondern nur die Auswertung der Näherungslösungen an den Punkten x, die in der Lösungsstruktur zurückgegeben werden. Gibt es eine Möglichkeit diese Näherungslösungen (kubischen Polynome) direkt auszulesen oder aus der Rückgabe des bvp4c solvers eine stetig differenzierbare Berechnungsvorschrift zu erzeugen die eben die kubischen Polynome darstellen?
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.