Verfasst am: 28.07.2009, 15:44
Titel: zu wenige randbedingungen für DGL 2. ordnung
heiho... hab im anhang mal die aufgabenstellung der programmierung angehangen. die sache, die für mich als "programmier-greenhorn" neu ist, is die, dass die DGL 2. ordnung von ner anderen DGL 1. ordnung abhängt. ich bin nun soweit, dass mir matlab die DGL 1. ordnung löst und müsste die dortige lösung jetzt ja an die DGL 2. ordnung übergeben... das is aber da kleinere problem. mich verwundert, dass bloß eine randbedingung für die DGL 2. ordnung gegeben ist, oder irre ich da und es ist irgendwo noch eine versteckt?
schönen dank schonmal für jegliche hinweise und tipps.
Ich sehe die einzige Möglichkeit darin, dass man die DGL als eine DGL in dx/dz und seiner Ableitung auffasst, womit es eine DGL 1. Ordnung ist und nur eine Anfangsbedingung benötigt wird. Natürlich bekommt man dann als Ergebnis dx/dz und nicht die Funktion x an sich.
man muss die DGL 2. Ordnung doch sowieso als system von DGLs 1. ordnung schreiben, ums numerisch mit matlab lösen zu können, oder? dann braucht man doch aber trotzdem 2 Anfangsbedingungen...
if(N<2)
error('2 Punkte sollten es schon sein!');
else
xwerte=linspace(a,b,N);
for n=1:N-1
deltax=xwerte(n+1)-xwerte(n);
nstrich(n)=(fhandle(xwerte(n)+deltax)-fhandle(xwerte(n)-deltax))/(2*deltax);
end
end
plot(xwerte(1:N-1),nstrich(: ));
Wenn ich nun beginne den file für die DGL 2. ordnung zu schreiben, würde ich so anfangen:
function ystrich=DGLOrd2(z,y)
ystrich=zeros(2;1);
y1strich = y2;
y2strich = nstrich*(y2^2+1)/n;
Wie bekomm ich denn nun meine nstrich und n aus dem "ableit" file in diese funktion rein?
und wieder schonmal ein dankeschön im vorraus für alle kommentare!
der Sinn einer Funktion ist, dass die Eingabeargumente von außen übergeben werden.
Die Funktion sollte vektorisiert sein. Z.B.:
fhandle=@(x)n0./(cosh(pi*x/(2*d))); % der Punkt ist wichtig
nwerte = fhandle(xwerte);
n_strich = diff(nwerte)./diff(xwerte);
Die Funktion ableit in der von dir geschriebenen Form würde so aufgerufen:
[ xwerte,nstrich ] = ableit(fhandle,a,b,N,n0,d)
dabei stehen in Klammern die Eingabeargumente, werden also wie gesagt NICHT innerhalb der Funktion belegt. Zurück kommen dann die xwerte und nstrich, ich würde mir aber auch die nwerte zurückgeben lassen.
hab grad bedenken, dass wir vielleicht aneinander vorbei reden würden. kann ich, so, wie du das geschrieben hast, also "[ xwerte,nstrich ] = ableit(fhandle,a,b,N,n0,d) ", diese funktion auch in anderen function files aufrufen? dass man die im workspace so aufruft is mir bekannt. nur da diese DGL 2.ordnung aus der aufgabe auch von n und dn/dx abhängt, müsste ich diese größen ja auch in dem file aufrufen können, der diese DGL löst. vielleicht meinst du das aber auch schon, ich hab nur heut abend leider keine zeit mehr es auszuprobieren...
danke nochmals,
if(N<2)
error('2 Punkte sollten es schon sein!');
else
xwerte=linspace(a,b,N);
nwerte=fhandle(xwerte);
for n=1:N-1
deltax=xwerte(n+1)-xwerte(n);
nstrich=(fhandle(xwerte(n)+deltax)-fhandle(xwerte(n)-deltax))/(2*deltax);
end
end
figure(1),clf
plot(xwerte,nwerte)
xlabel('x')
ylabel('n(x)')
figure(2),clf
plot(xwerte(1:N-1),nstrich(: ));
xlabel('x')
ylabel('dn/dx')
Diese function file ermöglicht mir nun n(x) abzuleiten.
Weiterhin hab ich folgende zwei programmteile geschrieben:
function xstrich=DGLOrd2(z,x)
nstrich=
nwerte=
xstrich=zeros(2,1);
xstrich = [x(2);nstrich*(x(2)^2+1)/nwerte];
Wie unschwer zu erkennen ist, hab ich ein problem damit nstrich und nwerte aus der function ableit in die function DGLOrd2 zu überführen...
Hat da jemand mal nen hilfreichen Tipp für mich?
Danke im Voraus,
juuuwe
function xstrich=DGLOrd2(z,x) % natürlich müssen an dieser Stelle noch die Parameter definiert werden, oder von außen an DGLOrd2 übergeben werden. [ xwerte,nwerte,nstrich ] = ableit(fhandle,a,b,N,n0,d,g)
xstrich=zeros(2,1);
xstrich = [x(2);nstrich*(x(2)^2+1)/nwerte];
danke schonema, aber ich komm immer noch nicht auf nen grünen zweig...
welche parameter meinst du denn, die noch bestimmt werden müssten? fhandle,a,b,N,n0,d,g sind ja schon definiert... fehlen da dann noch x und z, oder lieg ich da falsch?
Außerdem gibts in der zeile "xstrich = [x(2);nstrich*(x(2)^2+1)/nwerte];" ne fehlermeldung, von wegen "matrix dimension must agree". aber da darf ich doch eigentlich nix ändern, weil das doch die ableitungen sind.
welche parameter meinst du denn, die noch bestimmt werden müssten? fhandle,a,b,N,n0,d,g sind ja schon definiert... fehlen da dann noch x und z, oder lieg ich da falsch?
Es muss sichergestellt werden, dass die Parameter im aufrufenden Workspace aufrufst. Wenn man was vom Command Prompt aus aufruft, ist das der Base Workspace, ansonsten der Workspace der aufrufenden Funktion.
Code:
Außerdem gibts in der zeile "xstrich = [x(2);nstrich*(x(2)^2+1)/nwerte];" ne fehlermeldung
Ich vermute (weil ich gerade nicht genau weiss, was du machst), du musst komponentenweise Operationen, z.B. ./ [der Punkt ist das entscheidende] anwenden.
"Es muss sichergestellt werden, dass die Parameter im aufrufenden Workspace aufrufst. Wenn man was vom Command Prompt aus aufruft, ist das der Base Workspace, ansonsten der Workspace der aufrufenden Funktion."
Sorry, aber hier versteh ich nur bahnhof. ich weis weder was der command prompt, noch was der unterschied zwischen dem base workspace und dem workspace is...
"xstrich = [x(2);nstrich*(x(2)^2+1)/nwerte];" das ist einfach die zerlegung der DGL 2. ordnung in ein system von DGLs 1. Ordnung. ob das mit den punkten funktioniert kann ich aber erst ausprobieren, wenn der teil mit den parametern geklärt ist. aber das mit dem punktoperator wird schon stimmen.
Vielleicht würde es nicht schaden, sich wirklich mal von Grund auf mit MATLAB zu beschäftigen, etwa mit Hilfe eines Buches oder eines Kurses.
Zu den Fragen:
Command Prompt: das blinkende Etwas im Command Window ( >> )
Base Workspace: der zum Command Window gehörige Workspace, d.h. dort sind die Variablen abgelegt, die im Command Window angelegt werden.
Im Gegensatz dazu: der Function Workspace - dort sind die Variablen abgelegt, die von der aufrufenden Funktion übergeben wurden oder die innerhalb einer Funktion angelegt wurden.
Jede Funktion hat einen solchen Arbeitsbereich, und Variablen sind grundsätzlich nur in ihrem Arbeitsbereich sichtbar, mit den Ausnahmen will ich jetzt nicht ankommen.
hab in meinem studium bloß dieses semester mit matlab zu tun und muss mich da eben durchringen. heißt das also, dass ich alle Variablen (bis auf xwerte, nwerte und nstrich, die ich ja über die ableit function aufrufe) nochmal für meine function DglOrd2 definieren muss?
und nochmals danke für deine bemühungen...
Nicht *für*, sondern *in* der Funktion. Oder als Eingabeargumente übergeben.
Du solltest da auch nicht nur von Semester zu Semester denken, da solide MATLAB-Kenntnisse sicher auch bei der späteren Jobsuche hilfreich sein können.
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.