Verfasst am: 06.10.2015, 14:58
Titel: Frage an die Matlab-Profis --> 5 fach Integral
Hallo Leute,
ich bin auf einer Arbeit gestoßen, in der folgendes Integral (siehe Bild
links) gelöst worden ist (mit Hilfe von Mathcad) und daraus dann rechts
der Graph entstanden ist.
Nun möchte ich genau dieses Integral auch in Matlab lösen und die
Ergebnisse verifizieren.
Ich habe es probiert, doch als Ergebnis habe ich eig. nur Mist erhalten.
Daher erhoffe ich mir, hier einen Profi vll. zu erwischen, der mir den
super Tip geben kann o.ä..
VF=(J*mu0*(mu0*M))/4*pi*mu0; % Konstanter Vorfaktor vor dem Integral in einer Variable gespeichert
wf1=sqrt((z-d/2)^2+r^2+rho^2-2*r*rho*cos(thet-phi)); % Wurzelausdruck im ersten Integralausdruck
F1=rho/wf1;
wf2=sqrt((z+d/2)^2+r^2+rho^2-2*r*rho*cos(thet-phi)); % Wurzelausdruck im zweiten negativen Integralausdruck
F2=rho/wf2;
% Abgetippte Formel von der Arbeit in Matlab
IT1=VF*int(int(int(diff(int(int(F1-F2,thet,0,2*pi),rho,0,R)*r,r),phi,0,2*pi),z,Z-h/2,Z+h/2),r,c-w/2,c+w/2)
Dass der symbolische Weg mit
int
nicht immer möglich ist, hatte ich ja geschrieben. Dann wäre es naheliegend, den numerischen Weg zu versuchen (siehe Link unten).
Grüße,
Harald
Benjamin Nels
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 06.10.2015, 19:16
Titel:
Sorry!
Was dann passiert ist? Naja, da kam erstens kein Zahlenwert raus, sondern ein sehr sehr langer Ausdruck, der nicht ganz interpretierbar isr.
% % Abgetippte Formel von der Arbeit in Matlab
IT1=VF.*int(int(int(diff(int(int(F1-F2,thet,0,2*3.14),rho,0,R)*r,r),phi,0,2*3.14),z,Z-h/2,Z+h/2),r,c-w/2,c+w/2)
ich habe eine Frage:
Ich berechne zunächst symbolisch mit Matlab den Integralausdruck, d.h. das5-fache Integral, und diesen symbolischen Ausdruck berechne ich dann numerisch.
Einzige Sache die derzeit mich etwas verunsichert:
Matlab rechnet bei mir schon seit 6 Stunden, kann es sein, dass ein solches Integral (etwas komplex und dann noch 5 mal) so lange dauert bzw. noch länger dauern kann??
Bekommt man irgendwie raus, wie lange die Rechnung ungefähr dauern kann?
Ich mein, nicht dass ich nach einem Tag das abbreche, obwohl die Rechnung dann ne stunde später fertig wäre.
Über eure Hilfe freue ich mich.
Benjamin Nels
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 09.10.2015, 15:15
Titel:
Als Beispiel, was ich vorher berechnet hatte und was analytisch auch nicht integrierbar ist, war die Funktion
z=exp(-x^2*y^2)
Integriere ich diese Funktion symbolisch in Matlab, so berechnet mir Matlab den Ausdruck nicht, da es keine geschlossene Formel finden kann.
Benutze ich jedoch vpa, so wird mir der Wert berechnet.
Auf diesem Wege ist es möglich, zunächst auch möglich symbolisch zu integrieren und dann numerisch auszuwerten. Der Vorgang hier dauert aber ca. 1 min.
Bei Auswertung von 5 Integralen, dauert der Rechenvorgang dann 25 min.
So eine Rechnung kann schon mal lange dauern. Ärgerlich ist das dann, wenn man nach ein paar Stunden die Meldung bekommt, dass der Speicher nicht reicht.
Du kannst Deine Rechnung auch schrittweise von innen nach außen durchführen. Also erst das innerste Integral lösen, dann im nächsten Schritt das eins weiter außen liegende usw... Dann hast Du zumindest einen besseren Überblick, ob überhaupt noch was passiert und in welchen Schritten das ganze so langsam ist. Evtl. hilft es auch, die Ausdrücke nach den einzelnen Schritten mit
ausdruck=simplify(expand(ausdruck))
zu behandeln, um einen vereinfachten Term in den nächsten Schritt zu geben.
Und Du kannst die Sache vielleicht ein bisschen beschleunigen, wenn Du für Deine Variablen mit
assume
Einschränkungen des Wertebereichs machst. Dadurch kann man z.B. vermeiden, dass Matlab unnötigerweise komplex rechnet, wo es überhaupt nicht komplex sein kann.
Benjamin Nels
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 09.10.2015, 15:24
Titel:
Vielen Dank für deine Antwort. Ich werde das mal versuchen, aber wieso verwendest du erst expand dann simplify anstatt nicht direkt simplify(ausdruck)??
Ich werde es mal probieren.
Winkow hat Folgendes geschrieben:
warum versuchst du es nicht so wie harald vorgeschlagen hat? gefällt dir etwas an seiner lösung nicht? wenn ja was?
Ich kam damit nicht ganz klar, wie das ganze zu handhaben ist.
aber wieso verwendest du erst expand dann simplify anstatt nicht direkt simplify(ausdruck)??
Bei etwas längeren Ausdrücken findet simplify nicht unbedingt die einfachste Form. Vermutlich, weil es einfach eine andere Definition von "einfach" hat, als ich. Oder nicht weit genug aufdröselt. Weiß man nicht so genau... Wenn man dann vorher mit
expand
alles ausmultipliziert, hat man eine deutlich erhöhte Chance, dass simplify noch ein Paar Sachen findet, die in der nicht-ausmultiplizierten Form einfach stehen geblieben wären.
Bei wirklich langen Ausdrücken kommt man leider auch nicht immer umhin, das ganze mit etwas Intelligenz zu vereinfachen, indem man kleinere Teile, die ganz gut zusammenpassen, ohne den restlichen Term vereinfacht.
Zusammenfassen und Faktorisieren kann man dann am Schluss.
Benjamin Nels
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 09.10.2015, 16:27
Titel:
oK; vielen Dank für die Antwort.
Aber wie gesagt, der rechnet seit nun knapp 8 Stunden, ist das denn realisitisch?
Oder ist länger auch realisitisch?
Gibt es da jmd, der das vll. abschätzen kann?
Der Integralausdruck ist ja bekannt, 10 Std und mehr sind mir irgendwie kuriois...
Natürlich ist es möglich, dass das so lange dauert. Das Ergebnis wird auf Deinem Bildschirm auch ungefähr 20m lang sein. Bzw. wird am Ende der Zeile stehen, dass das Ergebnis so lang ist, dass Matlab es Dir nicht ausgeben möchte.
Du kannst übrigens nochmal ne Menge Zeit sparen, wenn Du an Stelle von 3.14 tatsächlich
pi
benutzt. Dann kann Matlab bei Funktionen, die 0 oder 1 sind, entsprechend vereinfachen, statt mit "ungefähr null" und "ungefähr 1" weiterrechnen zu müssen.
Wenn man das ganze in Schritte zerlegt, kommt das raus:
Code:
A = int(F1-F2,thet,0,2*pi);
B = int(A,rho,0,R);
C = diff(B*r,r);
D = int(C,phi,0,2*pi);
E = int(D,z,Z-h/2,Z+h/2);
F = int(E,r,c-w/2,c+w/2);
IT1=VF.*F ;
Fz=vpa(IT1,6);
Und dann sieht man auch, dass das erste, wo es haarig wird, die Ableitung in
C=...
ist. Und warum das so schwer ist, siehst Du auch, wenn Du Dir mal anguckst, wie B und A aussehen. Ich glaube nicht, dass Du so in endlicher Zeit auf einen grünen Zweig kommen wirst.
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.