WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Randwertproblem - Wie komme ich an die Funktion heran?

 

Trollstoi
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 18.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2012, 16:00     Titel: Randwertproblem - Wie komme ich an die Funktion heran?
  Antworten mit Zitat      
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:

y''(z) = a^2*y(z) (meine DGL). habe nun eine andre dgl:
f''(z) = a^2*(f(z)-y(z)) und möchte darin mein vorher bestimmtes y(z) verwenden.

Der Code (bisher nur für das Lösen der ersten DGL):
Code:
function mat4bvp

global theta;
xlow = 0; xhigh = 1;
for theta = 1:10
solinit = bvpinit(linspace(xlow,xhigh,10),@mat4init);
sol = bvp4c(@mat4ode,@mat4bc,solinit);

xint = linspace(xlow,xhigh);
Sxint = deval(sol,xint);
y(:,theta) = Sxint(1,:);
end
plot(xint,y)
axis( [0 1 0 1]);
title('C-Profil Platte')
xlabel('x')
ylabel('solution y')


% ------------------------------------------------------------
function dydx = mat4ode(x,y)
global theta;
dydx = [y(2)
        theta^2*y(1)];
% ------------------------------------------------------------
function res = mat4bc(ya,yb)
res = [ ya(2)
        yb(1)-1];
% ------------------------------------------------------------
function yinit = mat4init(x)
yinit = [ 1
          0];
% ------------------------------------------------------------



Kann mir jemand helfen?
Private Nachricht senden Benutzer-Profile anzeigen


Trollstoi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 18.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2012, 09:31     Titel:
  Antworten mit Zitat      
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.

Hier mal mein Code:
Code:

function mat5bvp

global theta;
theta = 3;
global coeff_A;
xlow = 0; xhigh = 1;
solinit_A = bvpinit(linspace(xlow,xhigh,250),@mat4init_A);
sol_A = bvp4c(@mat4ode_A,@mat4bc_A,solinit_A);

xint = linspace(xlow,xhigh);
Sxint = deval(sol_A,xint);
f(:,1) = Sxint(1,:);

plotvals=0:0.01:1;
%yvals1=interp1(xint,Sxint(1,:),plotvals,'linear');
%yvals2=interp1(xint,Sxint(1,:),plotvals,'cubic');
yvals3=interp1(xint,Sxint_A(1,:),plotvals,'spline');
%yvals3
coeff_A = polyfit(plotvals,yvals3,42);
%F = polyval(coeff_A,xint);


%plot(plotvals,F,'g',plotvals,yvals3,'b')

solinit_B = bvpinit(linspace(xlow,xhigh,250),@mat4init_B);
sol_B = bvp4c(@mat4ode_B,@mat4bc_B,solinit_B);

Sxint = deval(sol_B,xint);
f(:,2) = Sxint(1,:);

f(:,3) = 1-f(:,1)-f(:,2);

plot(xint,f(:,3),'b',xint,f(:,2),'g',xint,f(:,1),'r')
axis( [0 1 0 1]);
xlabel('x')
ylabel('solution y')

%-----------------------------------------------------
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];
% ------------------------------------------------------------
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.06.2012, 10:39     Titel:
  Antworten mit Zitat      
Hallo,

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:
Code:
f = @(xin) interp1(xdata, ydata, xin, 'spline')


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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Trollstoi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 18.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2012, 13:27     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Bofrostkenner
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 15.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2013, 13:11     Titel:
  Antworten mit Zitat      
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 [x_{n},x_{n+1}] 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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.