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

Integralfunktion definieren

 

Pacusch
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 05.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2017, 20:03     Titel: Integralfunktion definieren
  Antworten mit Zitat      
Hallo zusammen,

ich bin noch recht neu bei Matlab und habe einige Schwierigkeiten mit dem folgenden:
Ich habe eine mathematische Funktion g(x) definiert. Nun möchte ich eine weitere Funktion definieren, die wie folgt aussieht:

h(x) = $\int\limits_0^x g(s)ds$

Bisher realisiere ich dies wie folgt:
Code:
%
syms g(x)
g(x) = piecewise(abs(x-0.75)<1/4,exp(-1/(1/16-(x-0.75)^2)), 0);

yWertephi = zeros(1,300); %Platzhalter für yWerte, da dynamisches wachsen lassen des Vektors länger dauert
xWertephi = zeros(1,300);   %Platzhalter für xWerte, da dynamisches wachsen lassen des Vektors länger dauert
xWerteh = zeros(1,150); %Platzhalter für xWerte zum spiegeln
yWerteh = zeros(1,150); %Platzhalter für xWerte zum spiegeln

i=1;
z=0;
while z<1.51         yWertephi(i)=quadv(g,0,z);
    xWerteh(i)=z;
    yWerteh(i)=quadv(g_2,0,z);  
    xWerteh(j)=z;              
    z=z+0.01;
    i=i+1;
    end
   
           
end
 

Dies liefert zwar das gewünschte Ergebnis und lässt sich natürlich auch plotten, dauert jedoch sehr lang. Das liegt an der Schleife, wie ich bereits herausgefunden habe. Mir ist jedoch keine bessere Idee gekommen die Funktion h zu realisieren.
Außerdem muss ich h nun mit einer weiteren Funktion verketten und anschließend mit einer dritten multiplizieren. Das ist so nur sehr umständlich realisierbar.
Ich habe bereits versucht g als function handle zu definieren, dann kann ich aber trotzdem h nicht als
Code:

h(x) = integral(g,0,x);
 

Hat jemand eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.12.2017, 22:35     Titel:
  Antworten mit Zitat      
Hallo,

schon mal symbolische Integration mit int versucht?

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 05.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2017, 00:54     Titel:
  Antworten mit Zitat      
Hallo Harald,
danke für deine Antwort. Die Möglichkeit klappt, wenn ich einfache Funktionen (bspw. Sinus, Cosinus, Polynome, etc.) verwende.
Wenn ich allerdings die Funktion, die ich benötige, verwende, bekomme ich als Ausgabe nicht das Richtige.
Ich poste mal meinen Code und die Ausgabe
Code:

syms f_2(x) g(z) z x
f_2(x) = piecewise(abs(x-0.75)<1/4,exp(-1/(1/16-(x-0.75)^2)), 0);
g(z)    =1-int(f_2,0,z);
 

Ausgabe:
Code:

g(0)=1 %ist korrekt
g(1)=1 - int(exp(1/((x - 3/4)^2 - 1/16)), x, 1/2, 1) %nicht korrekt
 

Der zweite Ausdruck ist insofern korrekt als das erkannt wird, dass nur von 1/2 bis 1 integriert werden muss, da der Wert des Integrals von 0 bis 1/2 null ist. Allerdings wird der Wert des Integrals nicht ausgegeben.
Ich vermute, dass es daran liegt, dass die Stammfunktion nicht einfach hingeschrieben werden kann mit herkömmlichen Funktionen oder mache ich einen anderen Fehler?

Habe sonst schon überlegt, ob es funktioniert eine function zu schreiben bei der ich den Wert übergebe bis zu dem ich integrieren möchte und dann numerisch integriere. Ich denke aber, dass das nicht die optimale Lösung ist.
Hast du noch andere Ideen? Bin für jeden Ansatz dankbar.
Gruß Pacusch
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

der einzige Vorschlag, den ich dann noch hätte: du integrierst jedes Mal von 0. Wenn du aber das Integral für ein neues z haben möchtest, dann reicht ja die Integration über einen kleineren Bereich:
Code:
yWerteh(i)=yWerte(i-1) + quadv(g_2, z-0.01,z);


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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 05.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2017, 15:18     Titel:
  Antworten mit Zitat      
Hallo,
Habe deine Idee umgesetzt und einige weitere kleine Adaptionen an meinem Programm vorgenommen.
Code:

syms f(x)
f_2(x) = piecewise(abs(x-0.75)<1/4,exp(-1/(1/16-(x-0.75)^2)), 0);

C=quadv(f_2,-1,1);
CSchummel2 = 1.19404656*10^(-8);
g_2(x)= f_2(x)/CSchummel2;

%xWerte für h und phi
xWerteh = (0.01:0.01:1.5);
xWertephi = (-1.5:0.01:1.5);  

%Platzhalter für yWerte von h und phi, um dynamisches wachsen lassen zu
%vermeiden
yWertephi = zeros(1,301);
yWerteh = zeros(1,150);
yWertehnull = 1; %nullte Stelle besetzen, da sonst doppelt bei Spiegelung
yWerteh(1)= 1-quadv(g_2,0,0.01); %erste Stelle belegen, damit man in Schleife für j=1 nicht in yWerte(0) reinläuft

j=2;
z=0.02;
while z<1.5    %Schleife zum berechen von h_2(x)=1-Int(0,z)(g_2(x))
     
    yWerteh(j)=yWerteh(j-1)-quadv(g_2,z-0.01,z); %Stück des Integrals hinzufügen
    j=j+1;    
    z=z+0.01;
           
end
yWertehminus = fliplr(yWerteh); %spiegeln der yWerte von h
yWertephi = horzcat(yWertehminus,yWertehnull, yWerteh); %spiegeln von h

yWertephiquad = yWertephi.^2; %quadrieren von psi
Integralphi = trapz(xWertephi,yWertephiquad); %Berechnung des Integralquadrats von h_2

yWertepsi2 = yWertephi./sqrt(Integralphi);


 

So läuft das Programm um einiges schneller. Erstmal danke dafür.

Falls noch jemand Ideen hat für das Problem des definierens meiner Funktion, würde ich mich freuen.

Gruß Pacusch
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wenn ich nur quadv durch int ersetze, ist es deutlich schneller.

Grüße,
Harald
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.