Verfasst am: 10.10.2008, 11:56
Titel: Integration von abschnittweise def. Funktion
Hallo!
Ich möchte eine Funktion, welche abschnittsweise definiert ist, integrieren.
h(x) ist die zusammengesetzte Funktion. Diese soll mit quad ausgewertet werden.
Ich weiss nicht, wie ich der Funktion myfun eine beliebige Funktion übergeben kann und wie ich dies dann in quad korrekt aufrufen muss.
Q ist der Wert, den ich wissen möchte.
Vielleicht muss ich weiter ausholen:
Ich habe einen Signalverlauf s(t) der z.B. von Gmax nach unten verläuft bis auf eine Grenze Gu, danach steigt das Signal wieder bis auf Go, dann wieder Abstieg bis auf Gu, dann Aufstieg... usw bis eine Zeit t_ende erreicht ist, s(t) als Zickzackverlauf.
Für das Aufsteigen und Absteigen gelten jeweils verschiedene DGLs. Wenn ich diese Löse bekomme ich den Signalverlauf, aber ich weiss nicht zu welchem Zeitpunkt der neue Abstieg bzw. Aufstieg beginnt. Somit kann ich auch nicht wissen, ob t_ende schon erreicht ist.
Ich möchte das gesamte s(t) plotten und die Fläche darunter integrieren.
Meine Vorgehensweise ist deshalb:
Ich löse die DGL, bekomme s(t), brauche aber nun s(t=?)=Gu. Dies beschaffe ich mir etwas umständlich indem ich s(t) mit polyfit als Polynom darstelle. Dann ist s_poly(t=?)=Gu kein Problem.
Ich bekomme somit s_poly_1 für t=0 bis t1, s_poly_2 für t=t1 bis t=t2 etc.
Nun wollte ich eine Gesamtfunktion darstellen mit GF=s_poly_1+s_poly_2+....
Ich kann GF plotten.
Aber: ich kann GF nicht integrieren.
Deshalb meine Frage wie man beliebige abschnittsweise definierte Funktionen integriert.
In meinem Fall weiss ich auch nicht wieviele Funktionen die GF dann darstellen. Ich werde also etwas wie
GF = GF + s_poly(neu) haben und mein GF somit entsprechend verlängern.
Habe das nun so gelöst, was ich nicht besonders elegant finde:
Code:
function test
x=0:0.1:10;
h='';
g = 'x.^2';
f = 'x';
f2 ='sin(x)';
ich verstehe leider noch immer nicht 100%ig, wo das Problem liegt. Kennst Du denn die Zeiten t1, t2, ... (Knick-Stellen) vor dem Integrieren?
Dann gibt es doch zwei Möglichkeiten:
Erstens eine if-else-Konstruktion wie in meinem ersten Vorschlag. In jedem Abschnitt [t_k,t_{k+1}] kann dann die dort vorliegende Funktion definiert werden.
Zweitens eine Summe der Einzelintegrale. Wenn Du weißt, wie die Funktion in jedem Abschnitt aussieht, und die Grenzen jedes Abschnitts kennst, kannst du für jeden Abschnitt die dort gegebene Funktion integrieren und dann alles aufsummieren.
Ich finde, Deine Darstellung GF=s_poly_1+s_poly_2+.... (die Du ja dann noch mit logischen Ausdrücken (t1<=x<=t2 usw.) kombinieren musst) macht die Sache komplizierter, als sie ist. Es soll doch gar nichts addiert werden, sondern jedesmal eine andere Funktion genommen werden (s_poly_1 oder s_poly_2 ...). Oder bin ich gerade auf dem Holzweg?
Hallo Bijick!
Danke für die Antworten. Ja ich kenne die Zeiten vor dem Integrieren und ja es ist keine wirkliche Addition sondern einfach ein Aneindanderhängen von Funktionen. Es gilt also entweder s_poly_1 oder s_poly_2.
Und es stimmt ich kann die einzelnen Funktionen einfach einzeln integrieren und dann die Einzelergebnisse zusammenrechnen.
Wie sieht es dann mit dem Plotten aus?
Muss ich dann nicht doch alles aneinanderhängen. Ich dachte eben ich nehme eine Darstellung für das Gesamte und kann das Plotten und integrieren.
Wenn ich alles Stück für Stück berechne, dann muss ich
f1 für t1..t2
f2 für t2..t3
f3 für t3..t4 usw. plotten. Wobei ich die Anzahl hier nicht kenne.
Hallo Bijick!
Vielen Dank für die Antworten und Beispiele. Deine Funktion test funktioniert und erfüllt auch die Anforderungen von Plotten und Integrieren.
Jedoch ist mein Vorgang bis zu einem tende folgendermaßen:
Startwert -> Absinken(es gilt berechnetes polynom1) bis untere Schwelle Su -> Anstieg (poly2) bis So -> Abstieg (poly3) -> Anstieg (poly4) ...
bis der Wert tende erreicht ist.
Ich weiss also nicht wieviele y = ... Zeilen ich in function myfun brauche. Vielleicht ist mein Blick auch verstellt.
Momentan ist meine Denke die ganze Funktion in eine leider unübersichtliche Zeile zu packen und diese dann mit cat immer weiter zu erweitern bis eben dieses tende erreicht ist.
Falls es ein besseres Vorgehen gibt bin ich für Tipps dankbar.
Den Vorschlag von dir kann ich, soweit ich es verstehe, nur anwenden, wenn ich bereits weiss aus wieviel Abschnitten meine Funktion besteht. Die Parameter der einzelnen Abschnitte t1,t2... kann ich flexibel definieren, aber einen Abschnitt hinzufügen (während der Berechnung)?
gut, dass Du so hartnäckig bist. Mir ist jetzt die bisher schönste Lösung eingefallen: mit polyval. Die Vektoren in p sind poly1, poly2 usw., so wie sie aus polyfit kommen. t muss einen Eintrag mehr als p haben.
Hallo Bijick!
Danke für deine wirklich sehr elegante Lösung. Ist, wie es bei eleganten Lösungen eben so ist, etwas schwer lesbar. Funktioniert aber fast einwandfrei! Danke!
Ein Problem ist wenn man bis t=12 integrieren bzw. zeichnen will.
Dann braucht man einen weiteren Eintrag in p. Ich habe das Problem jetzt so gelöst, dass ich den letzten Eintrag einfach doppelt habe.
Kann man das noch eleganter lösen?
Vielen Dank!
Tolles Forum. Rudi
PS. Warum t immer einen Eintrag mehr haben muss als p ist mir nicht klar geworden. Eine Erläuterung wäre toll.
Code:
function arraytest
cell_p={[10-14],[-0.5010],[10-103],[10-103]};
t=[0,4,8,12];
%x0=0:0.1:10;
x0=linspace(0,12,100);
% zur Erläuterung: findet letztes Element in t welches noch kleiner oder gleich 6 ist find(6>=t,1,'last') %liefert:2, d.h. für t=6 gilt das 2. Element von cell_p
% Element 1: t=0..4 % Element 2: t=4..8 % usw.
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.