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

Integration von abschnittweise def. Funktion

 

rudi_
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 18.07.08
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 10.10.2008, 12:56     Titel: Integration von abschnittweise def. Funktion
  Antworten mit Zitat      
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.




Code:
x=0:0.1:10;
g=x.^2;
f=x;
h=g.*(x<=5)+f.*(x>=5);

Q = quad(@myfun(g),0,3)

function y = myfun(x, beliebigeFunktion)
        y = beliebigeFunktion;
end


Was funktioniert ist:
Code:
Q = quad(@myfun,0,3)
    function y = myfun(x)
        y = x+3;
    end


Aber wie kann ich das x+3 allgemein übergeben?

Vielen Dank für eure Hilfe!
Rudi
Private Nachricht senden Benutzer-Profile anzeigen


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 10.10.2008, 13:10     Titel: Re: Integration von abschnittweise def. Funktion
  Antworten mit Zitat      
Hallo Rudi,

probier mal
Code:
Q = quad(@myfun,0,3)

function y = myfun(x)
    if x<5
         y=x.^2;
    elseif x==5
         y=x+x.^2;
    else
         y=x;
    end
end


Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 10.10.2008, 13:11     Titel:
  Antworten mit Zitat      
So weh mir der Weg über eval auch tut, eine andere Lösung fällt mir grad auf Anhieb nicht ein:
Code:

function test

g = 'x+3';

Q = quad(@myfun,0,3)

    function y = myfun(x)
        y = eval(g);
    end

end
 

Das ganze dann als test.m abspeichern.

Gruß
Alex

PS: Ich hoffe es kommt noch eine bessere Lösung...

/edit: Hab mal das Zitat in nen Code umgewandelt Wink
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?

Zuletzt bearbeitet von steve am 10.10.2008, 13:18, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 10.10.2008, 13:15     Titel:
  Antworten mit Zitat      
Jetzt bin ich gespannt, was gemeint war... Smile
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 10.10.2008, 13:19     Titel:
  Antworten mit Zitat      
Bijick hat Folgendes geschrieben:
Jetzt bin ich gespannt, was gemeint war... Smile
Und was meinst du damit?! Confused
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 10.10.2008, 14:12     Titel:
  Antworten mit Zitat      
Hallo Alex,

naja, ich frage mich, ob meine oder Deine Lösung das gewünschte war. Die Frage war wohl mehrdeutig, wie ich nach Deiner Antwort erst gemerkt habe.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 10.10.2008, 14:15     Titel:
  Antworten mit Zitat      
Verdammt Laughing

Ich hätte vor meinem Post mal nach oben scrollen sollen - dann hätte ich gesehen, dass du ja schon was dazu geschrieben hast Rolling Eyes

Naja, da bin ich dann auch mal gespannt...
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
rudi_
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 18.07.08
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 10.10.2008, 14:53     Titel:
  Antworten mit Zitat      
Hallo!
Danke für die Antworten.

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)';

h=cat(2,h,'+',g,'.*(x<=5)')
h=cat(2,h,'+',f,'.*(x<=5)')
h=cat(2,h,'+',f2,'.*(x<=5)')
%h=h+eval(f).*(x>=5);


Q = quad(@myfun,0,1)

    function y = myfun(x)
        y = eval(h);
    end

end



Vielleicht gibts noch nen einfacheren Weg als diese Stringzusammenstückelei.

Gruß
rudi
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 10.10.2008, 15:33     Titel:
  Antworten mit Zitat      
Hallo rudi,

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?

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
rudi_
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 18.07.08
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 10.10.2008, 16:25     Titel:
  Antworten mit Zitat      
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.

Wie würde man hier vorgehen?

Vielen Dank!
Rudi
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 10.10.2008, 17:50     Titel:
  Antworten mit Zitat      
Hallo Rudi,

ich habe es jetzt mit logischer Indizierung geschafft, dann geht es einheitlich fürs Zeichnen und fürs Integrieren:

Code:
function test

t1=4;
t2=8;
t3=12;

x0=0:0.1:10;

% Zeichnen
plot(x0,myfun(x0))

% Integrieren
Q = quad(@myfun,0,10)

    % Abschnittsweise Funktion
    function y = myfun(x)
   
    y = zeros(length(x),1);
    y(x>=0&x<=t1) = x(x>=0&x<=t1).^2-14;    
    y(x>t1&x<=t2) = -0.5*x(x>t1&x<=t2).^2+10;
    y(x>t2&x<=t3) = 10*x(x>t2&x<=t3)-103;

    end % function myfun

end % function test


Wichtig ist, dass die Indizierung bei y und bei x stehen muss.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
rudi_
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 18.07.08
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 16.10.2008, 10:50     Titel:
  Antworten mit Zitat      
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)?

Ich hoffe mein Problem ist verständlich erklärt.

Vielen Dank für Eure Hilfe!
Grüße
Rudi
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 16.10.2008, 13:12     Titel:
  Antworten mit Zitat      
Hallo Rudi,

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.

Code:
p={[1 0 -14],[-0.5 0 10],[10 -103]};
t=[0,4,8,12];
x0=0:0.1:10;

% Zeichnen
y01=arrayfun(@(s)polyval(p{find(s>=t,1,'last')},s),x0);
plot(x0,y01)

% Integrieren
Q1 = quad(@(x0)arrayfun(@(s)polyval(p{find(s>=t,1,'last')},s),x0),0,10)


Voraussetzung ist jetzt, dass alle Teilfunktionen Polynome sind, aber das ist ja bei Dir gegeben.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
rudi_
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 18.07.08
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 17.10.2008, 14:44     Titel:
  Antworten mit Zitat      
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.

Code:
find(12>=t,1,'last')

liefert dann: 4

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={[1 0 -14],[-0.5 0 10],[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.

% Zeichnen
y01=arrayfun(@(s)polyval(cell_p{find(t<=s,1,'last')},s),x0);
plot(x0,y01)

% Integrieren
Q1 = quad(@(x0)arrayfun(@(s)polyval(cell_p{find(s>=t,1,'last')},s),x0),0,1)
end
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 - 2024 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.