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

Testfunktion zum Lösen von ODEs

 

Chefkoch

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.11.2013, 17:25     Titel: Testfunktion zum Lösen von ODEs
  Antworten mit Zitat      
Hallo zusammen,

ich bin Neuling in Matlab und habe leider auch nur Grundkenntnisse in Sachen Programmierung. Bei folgender Aufgabe komme ich nicht weiter:


Ich soll eine Funktion wie folgt aufbauen:
function [result] = test(solver, function, timespan, init)

- Dabei soll man der Variable solver einen oder mehrere Solver übergeben können, z.B ode45,ode113,...Mit diesen solvern soll dann eine beliebige, einzugebende DGL (function) gelöst werden.
- timespan ist er Bereich in welchem die Funktion angenähert werden soll
- init sind die Anfangsbedingungen

Nach der Eingabe soll folgende Lösung in einer Zellvariablen ausgegeben werden.

Spalte 1: Solvername
Spalte 2: Lösungsvektor y
Spalte 3: Zeit t die zur Ermittlung der Lösung mit jeweiligem solver
Spalte 4: Anzahl der benötigten Schritte mit jeweiligem solver


Die Zeit kann ich ja über tic und toc messen lassen? Die Vektoren werden doch im Workspace hinterlegt, sodass ich die Anzahl der Schritte herauslesen und den Lösngsvektor aufrufen kann.

Leider komm ich beim Programmieren aber nicht wirklich voran, könnte mir jemand Starthilfe geben?


Vielen Dank!


Chefkoch

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.11.2013, 18:07     Titel:
  Antworten mit Zitat      
Ich hab hier mal meinen bisherigen Ansatz, bitte nicht lachen Razz
Für func hab ich einfach mal eine Bsp. DGL eingefügt.

Ich hab eine Funktion und ein Skript zum Aufruf:
Funktion

Code:
function[results] = test(solvers, func, timespan, init)


results = cell(length(solvers),4);


switch solvers
    case 'ode45'
        [t,y] = ode45(@func, timespan, init);
        results{1,2} = t;
        results{1,3} = y;
    case 'ode23'
        [t,y] = ode23(@func, timespan, init);
        results{2,2} = t;
        results{2,3} = y;
    otherwise
        printf('ERROR');
end
       
       
end



Skript:

Code:
solvers = {'ode23'; 'ode45'};
func = ((3*t^2)/exp(y));
timespan = [0 10];
init = [2 3];


[results] = test(solvers, func, timespan, init);



Wenn ich das Skript ausführe, erhalte ich diesen Fehler:
>> test_Script
Undefined function or variable 't'.

Error in test_Script (line 2)
func = ((3*t^2)/exp(y));
 
Harald
Forum-Meister

Forum-Meister


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

ein angepasstes Beispiel:

Code:
function dgltest

solvers = {@ode23; @ode45};
func = @(t,y) ((3*t.^2)./exp(y));
timespan = [0 10];
init = [2];


[results] = test(solvers, func, timespan, init)


function[results] = test(solvers, func, timespan, init)


results = cell(length(solvers),4);

for I = 1:length(solvers)
        odefun = solvers{I};
        [t,y] = odefun(func, timespan, init);
        results{I,1} = func2str(odefun);
        results{I,2} = t;
        results{I,3} = y;
        results{I,4} = numel(t)-1;
   
end

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2013, 23:22     Titel:
  Antworten mit Zitat      
Hallo Harald,

erstmal danke, ich habe das nun noch ein bisschen für mich angepasst und jetzt funktioniert es auch Smile
Ich habe in der ersten Zeile: Function dgltest weggelassen, da es trotzdem funktioniert. Ist dieses function lediglich für eine mögliche weitere Verwendung von Nöten?


Nun habe ich noch eine Frage.
Ich habe jetzt eine etwas kompliziertere DGL. Für diese hab ich ein separates function file erstellt.

function ddx = DIFF(t,y)
. . .

Wie kann ich diese aufrufen ohne sie neu eingeben zu müssen?
Ich hab das so probiert:

func = @DIFF;


Geht aber leider nicht.


Viele Grüße
 
Harald
Forum-Meister

Forum-Meister


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

an sich sollte das funktionieren.
Was funktioniert denn daran nicht?
D.h. welche Fehlermeldung bekommst du, oder inwiefern tritt ein unerwartetes Verhalten auf?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2013, 23:54     Titel:
  Antworten mit Zitat      
Ok, das hat sich erledigt.
Habe Groß-/Kleinschreibung nicht beachtet Embarassed
 
Chefkoch

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2013, 01:03     Titel:
  Antworten mit Zitat      
Nun habe ich ein Problem beim Plotten.

Ich erstelle eine neue Funktion Plot(results). Beim Ausführen das Ergebnis der berechneten DGL plotten.

Wenn ich nun innerhalb der Funktion plot(t,y) eingebe erhalte ich folgenden Fehler:

Undefined function or variable 't'.


Die Werte sind ja eigentlich alle im Workspace hinterlegt. Tippe ich plot(t,y) im Command Window ein, funktioniert das ganze, innerhalb der Funktion nicht. Was muss ich beachten?


Viele Grüße
 
BlackDread
Forum-Century

Forum-Century


Beiträge: 212
Anmeldedatum: 11.05.11
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 27.11.2013, 10:40     Titel:
  Antworten mit Zitat      
Hallo,
an welcher Stelle steht denn dein plot? Hast du schon mal einen Break-Point auf die Zeile gesetzt und geschaut, ob t und y an dieser Stelle wirklich verfügbar sind?

Grüße
Chris
_________________

--> Kapieren statt Kopieren <---
____________________________________________________
FAQs sind dazu da, FAQs zu beantworten Wink
Richtig fragen!
Private Nachricht senden Benutzer-Profile anzeigen
 
reichkrystofski
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 26.11.13
Wohnort: Biederitz
Version: 2006b 32bit, 2009b 64bit
     Beitrag Verfasst am: 27.11.2013, 11:34     Titel:
  Antworten mit Zitat      
Chefkoch hat Folgendes geschrieben:

Die Werte sind ja eigentlich alle im Workspace hinterlegt. Tippe ich plot(t,y) im Command Window ein, funktioniert das ganze, innerhalb der Funktion nicht. Was muss ich beachten?


Eine Funktion sieht die Variablen vom workspace nicht. Du musst alle benötigten Variablen deiner Plotfunktion übergeben. In seltenen Fällen kann man auch globale Variablen benutzen, würde ich aber vermeiden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Chefkoch

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2013, 11:36     Titel:
  Antworten mit Zitat      
Hi,

danke, habe ich gerade probiert und jetzt wird es auch geplottet.
Gibt es eine Möglichkeit übereinanderliegende Kurven transparent darzustellen? Ich habe jetzt die Kurve für jeden solver mit einer anderen Farbe. Es wird allerdings immer nur die oberste angezeigt.

Danke!


Viele Grüße
 
reichkrystofski
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 26.11.13
Wohnort: Biederitz
Version: 2006b 32bit, 2009b 64bit
     Beitrag Verfasst am: 27.11.2013, 11:46     Titel:
  Antworten mit Zitat      
Du könntest auch verschiedene linestyles verwenden, z.B.
Code:

plot(x,y,':');
plot(x1,y1,'--');
 


Andernfalls musst du dich mit den Eigenschaften des plot-Handles auseinandersetzen. Manche Element kann man Transparent schalten. Bei einem einfachen plot scheint mir das nicht offensichtlich.

Code:

handle = plot(x,y);
get(handle)
set(handle,'Color','r'); %Bsp Farbe ändern
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Chefkoch

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2013, 16:01     Titel:
  Antworten mit Zitat      
Ok super, ich danke euch, hat funktioniert.

Jetzt habe ich aber ein bar. Für dieses habe ich zum Beispiel
Code:
a = [ 1 2 3 4 5]


Plotte ich dieses bar:
Code:

werden ja alle 5 Balken rot. Wie kann ich es einrichten, dass ich die Farbe der einzelnen Balken bestimmen kann?

Viele Grüße
 
Harald
Forum-Meister

Forum-Meister


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

für jede Farbe einen bar-Aufruf, nach dem ersten ein "hold on", nach dem letzten ein "hold off".

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2013, 21:33     Titel:
  Antworten mit Zitat      
Hab das gerade mal probiert, aber ich glaub ich hab das noch nicht so gaz verstanden:

Code:
aa = [2 4 6];

figure(1)
subplot(121)
axis([0 8 0 10])

bar(aa(1),'r')
hold on
bar(aa(2),'g')
bar(aa(3),'b')
hold off


Die Balken werden wie es aussieht alle übereinander gelegt anstatt nebeneinander.
 
Harald
Forum-Meister

Forum-Meister


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

das kann man anpassen:

Code:
aa = [2 4 6];

figure(1)
subplot(121)
axis([0 8 0 10])

b = bar(1-0.33,aa(1),'r', 'barwidth', 0.3)
hold on
bar(1, aa(2),'g', 'barwidth', 0.3)
bar(1+0.33, aa(3),'b', 'barwidth', 0.3)
hold off


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.