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

Wie löse ich das Integral numerisch?

 

Benjamin19833

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.04.2021, 13:51     Titel: Wie löse ich das Integral numerisch?
  Antworten mit Zitat      
Hallo Leute,
wie löse ich das Integral numerisch am besten?

Dabei geht es ganz einfach um einfache Kinematikgesetze.

Irgendwie stehe ich auf dem Schlauch.

Um folgende Integrale gehts, die ich numerisch lösen möchte:

v=Integral_a_dt + v0

D.h. ich möchte einmal die Funktion a nach der Zeit integrieren, im Zeitinterval von 0 bis 10, und habe eine Anfangsgeschwindigkeit von v0.

Wahrscheinlich ist das einfach, jedoch stehe ich Momentan auf dem Schlauch.

Über eure Hilfe bedanke ich mich vielmals.


Harald
Forum-Meister

Forum-Meister


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

wie ist a gegeben?
Als Datenpunkte: trapz / cumtrapz
Als Formel: integral

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Benjamin19833

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.04.2021, 14:08     Titel:
  Antworten mit Zitat      
Hallo Harald,

a ist als Funktion gegeben.

Aber genau das ist mein Problem.

Irgendwie funktioniert das bei mir nicht.

Ich möchte a numerisch integrieren, wobei ich noch eine Anfangsbedingung habe.

Ungefähr so:
v(t)=Int(a(t))+v0

v(t) soll jedoch nur solange integriert werden wie v >0 ist, also sobald die Geschwindigkeit 0 ist, soll es auch null bleiben.


Weißt du vll. wie?
 
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.04.2021, 14:28     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Irgendwie funktioniert das bei mir nicht.

Das ist sehr vage. Je konkreter du das Problem beschreibst, desto besser kann man dir helfen.

Zitat:
Ungefähr so:
v(t)=Int(a(t))+v0

Du hast ja vermutlich nicht das in MATLAB eingegeben (und wenn doch, wird es kein numerisches Integral). Poste bitte deinen (möglichst vollständigen) Code.

Zitat:
v(t) soll jedoch nur solange integriert werden wie v >0 ist, also sobald die Geschwindigkeit 0 ist, soll es auch null bleiben.

Nach der Integration
Code:
firstNonpos = find(v <= 0, 1);
v(firstNonpos:end) = 0;


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Benjamin19833

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2021, 09:48     Titel:
  Antworten mit Zitat      
Ich will zunächst annehmen, dass a konstant sei.

Wenn ich das so definiere, dann bekomme ich eine Fehlermeldung.

fun = @(t) 1;

Wenn ich es jedoch so definiere, dann klappt es, sieht aber nicht gut aus:
fun = @(t) 0*t+1;

Wie löse ich das am besten?

Danke Harald für deine Antworten.
 
Benjamin19833

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2021, 09:55     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

wie ist a gegeben?
Als Datenpunkte: trapz / cumtrapz
Als Formel: integral

Grüße,
Harald


Ich habe folgendes Problem:
Ich möchte die Funktion a integrieren, wobei ich a variabel halten will, z.B. als Konstante oder als lineare Funktion etc.

Und dann möchte ich gerne einfach a über die Zeit plotten.

Derzeit sieht mein Code so aus:

time=linspace(0,5,500)
fun = @(t) 0.*time+a1;

q = integral(fun,0,5)+v1

plot(time,q)
 
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.04.2021, 10:25     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
wobei ich a variabel halten will, z.B. als Konstante oder als lineare Funktion etc.

Für numerische Integration brauchst du immer eine konkrete vorgegebene Funktion.

Zitat:
Und dann möchte ich gerne einfach a über die Zeit plotten.

Dann plotte doch a und nicht das Integral?
Und wenn du doch das Integral plotten willst: das ist doch nur eine Zahl? Wie soll das vernünftig geplottet werden?
Oder willst du etwa die Funktion parametrisieren und sehen, wie sich das Integral in Abhängigkeit des Parameters verändert? Dann solltest du aber den Parameter auf der x-Achse plotten. Zudem brauchst du eine Schleife, um die Integrale zu berechnen.

Zusammengefasst: dein Vorhaben ist sicher nicht sehr schwierig umzusetzen, nur muss erst mal genau klar sein, was du vor hast.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Benjamin19833

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2021, 11:14     Titel:
  Antworten mit Zitat      
Danke Harald für deine Antwort.

Nun habe ich fast eine Lösung.

Ich definiere eine symbolische Abschnittsweise definierte Funktion a, und integriere diese und erhalte dann v.

Code:

syms t a;

aego=piecewise(0<=t<5,-7);

vego=int(aego)+v1_ego
 


Das ist wunderbar.

Es gibt nur ein Problem:

Wie definiere ich, dass v<0 = 0 sein soll, da ich keine neg. Geschwindigkeiten haben möchte.

Besser wäre es, wenn ich irgendwie nun die piecewise funktion in eine normale Matlabfunktion überführen könnte.

Das würde mein Problem sicherlich lösen, wenn das gehen würde.
 
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.04.2021, 12:07     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Wie definiere ich, dass v<0 = 0 sein soll, da ich keine neg. Geschwindigkeiten haben möchte.

Code:
vego = max(vego, 0))


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Benjamin19833

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2021, 12:33     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

Zitat:
Wie definiere ich, dass v<0 = 0 sein soll, da ich keine neg. Geschwindigkeiten haben möchte.

Code:
vego = max(vego, 0))


Grüße,
Harald


Danke Harald, aber es ist zum Haare-Raufen.

Ich habe folgenden Code:

Code:

time=linspace(0,5,200);


aego=piecewise(0<=t<5,-7);

vego=int(aego)+20
vego=max(vego,0);

sego=int(vego)+15


Wie bekomme ich nun sego als Datensatz hin, sodass ich plot(time,sego) durchführen kann? Ich brauche ein Datensatz.

Wenn ich die Funktion subs nehme, dann passt das nicht.

Hintergrund:
Ich möchte eine beliebige Funktion a durchgeben.

Anschließend möchte ich vego und sego über die Zeit time plotten - da ich das später x-fach wiederholen möchte, zB. bei verschiedenen Startparametern, möchte ich idealerweise eine analytische Gleichung haben, damit das sehr schnell berechnet werden kann.
 
Benjamin19833

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2021, 16:17     Titel:
  Antworten mit Zitat      
Hallo Harald,

was ich möchte ist, das Simulink-Modell (siehe Bild) in Matlab zu "überführen".

Hintergrund ist, dass ich mehrere Tausend Berechnungen mit verschiedenen Parametern durchführen möchte, da erhoffe ich mir, dass

1) über Matlab das schneller geht als über Simulink
2) das ganze noch einmal schneller geht, wenn man analytisch oder halb-analytisch machen könnte.


Das ist der Grund meiner obigen Fragestellung.

INT.png
 Beschreibung:

Download
 Dateiname:  INT.png
 Dateigröße:  21.92 KB
 Heruntergeladen:  215 mal
 
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.04.2021, 16:34     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Wie bekomme ich nun sego als Datensatz hin, sodass ich plot(time,sego) durchführen kann?

Spricht etwas dagegen, fplot zu verwenden? z.B.
Code:
fplot(sego, [0, 5])


Zitat:
Wenn ich die Funktion subs nehme, dann passt das nicht.

Bitte schreibe immer dazu, wie du die Funktion verwendest und was daran nicht passt.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Benjamin19833

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2021, 16:56     Titel:
  Antworten mit Zitat      
Code:

time=linspace(0,5,200);

syms t

aego=piecewise(0<=t<5,-7);

vego=int(aego)+20;
vego=max(vego,0);

sego=int(vego)+15;

V0=subs(vego,t,[time]);
V0=double(V0);

plot(time,V0)

S0=subs(sego,t,[time])
S0=double(S0);


Jap, ich hätte die gerne als Datensätze, weil ich noch das dynamische Verhalten eines anderen Objekts mit unterschiedlicher Geschwindkeit untersuchen möchte und dann evaluieren, wann die 2 Objekte sich schneiden, wo Sie sich schneiden und welche Relativgeschwindigkeit beide haben.

Ich bin erst mal dabei das ganze für ein Objekt zu machen, das zweite ist ja dann analog.
 
Benjamin19833

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2021, 16:57     Titel:
  Antworten mit Zitat      
Bei dem Code, was ich soeben eingefügt habe, funktioniert das gut noch mit vego jedoch nicht mehr mit sego.
 
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.04.2021, 17:27     Titel:
  Antworten mit Zitat      
Hallo,

wenn du ohnehin numerisch arbeiten willst, verstehe ich nicht, warum du überhaupt mit piecewise und int anfängst, was nun mal symbolisch ist.


Code:
aego = (0 <= time & time < 5) .* (-7);

vego= cumtrapz(time, aego) + 10;
vego=max(vego,0);

sego= cumtrapz(time, vego) + 15;


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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 - 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.