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

Frage zu quad, globale Variablen vermeiden

 

bluesaturn
Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2014, 12:58     Titel: Frage zu quad, globale Variablen vermeiden
  Antworten mit Zitat      
Hallo Forum,
ich möchte folgendes in Matlab numerisch integrieren (mit quad)


<br />
g(q)=\int_0^1 \! f(q,\mu) \, d\mu
<br />

q ist ein Vektor mit ca. 500 Punkten.
Die Funktion f ist eine Funktion, die von q und mu abhängt. Gleichzeitig sind in f noch Parameter enthalten, a_i.
Bisher habe ich das immer mit bösen for-Schleifen und globalen Variabeln für die Parameter a_i gelöst.
Geht das nicht auch besser bitte?

Danke schön.
Gruss
blue
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 03.02.2014, 13:06     Titel:
  Antworten mit Zitat      
denke so#
Code:
f=@(x,y) x+y;
f2=@(x) quad(@(y) f(x,y),0,1);

achja:
Zitat:
quad will be removed in a future release. Use integral instead.

und noch was :
a_i das siht so aus als würdest du den index im namen verstecken. davon kann ich nur abraten
a(i) ist hier die weitaus bessere methode.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
bluesaturn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2014, 14:59     Titel:
  Antworten mit Zitat      
Winkow hat Folgendes geschrieben:
denke so#
Code:
f=@(x,y) x+y;
f2=@(x) quad(@(y) f(x,y),0,1);

achja:
Zitat:
quad will be removed in a future release. Use integral instead.

und noch was :
a_i das siht so aus als würdest du den index im namen verstecken. davon kann ich nur abraten
a(i) ist hier die weitaus bessere methode.


Hallo Winkow.
Edit: Nein, es ist doch nicht einleuchtend.

Ist f2=f2(x), es wird aber über y=[0,1] integriert?


Bisher übergab ich an die quad-Funktion den Namen eines m-files, die Parameter wurde via globaler Variabeln übergeben. Das war sicherlich nicht gut.

Die Parameter a_i sollten verschiedene Vorfaktoren bezeichnen.
Wie z.B. a1*x+y*a2. Jeder Parameter hat im Prinzip einen anderen Namen, der Einfachheit halber habe ich die hier nur mal a_i genannt.

Eine weitere Frage:
Was passiert, wenn einer dieser Parameter ebenfalls ein Integral ist, welches weder von q noch von mu abhängt? Nennen wir dessen Integrationsvariabel r.
Wie macht man das bitte via anonymer Funktion? Natürlich hat auch dieses Integral wieder konstante Parameter. Leider ist der Ausrdruck nicht so einfach wie x+y. Smile

Danke schön.
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 03.02.2014, 15:03     Titel:
  Antworten mit Zitat      
kann dir nicht ganz folgen. meinst du sowas?
Code:
f=@(x,y,p) p(1)*x+y*p(2);
a=[1,2];
f2=@(x) quad(@(y) f(x,y,a),0,1);

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
bluesaturn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2014, 15:12     Titel:
  Antworten mit Zitat      
Winkow, ich verstehe deine letzte Frage nicht. Deinen Code mit dem p und dem a verstehe ich nicht. Tut mir leid.

Eine der Funktionen sieht z.B. so aus:

Code:
f=@(q,mu) (2.*(rho_shell_cs-rho_solvent_cs).*V_shell_cs.*sin(q.*(L_core_cs+2.*tcs)./2.*mu)./(q.*(L_core_cs+2.*tcs)./2.*mu).*besselj(1,q.*(r_core_cs+tcs).*sqrt(1-mu.^2))./(q.*(r_core_cs+tcs).*sqrt(1-mu.^2))+...
    2.*(rho_core_cs-rho_shell_cs).*V_core_cs.*(sin(q.*L_core_cs./2.*mu))./(q.*L_core_cs./2.*mu).*besselj(1,q.*r_core_cs.*sqrt(1-mu.^2))./(q.*r_core_cs.*sqrt(1-mu.^2))).^2;
 


Man sieht nun die ganzen Vorfaktoren, wie z.B. V_shell_cs etc. q und mu wie gehabt.


Wäre der Code dann wie folgt richtig:
Code:

q=[1e-3:1e-1:10]

f=@(q,mu) [2.*(rho_shell_cs-rho_solvent_cs).*V_shell_cs.*sin(q.*(L_core_cs+2.*tcs)./2.*mu)./(q.*(L_core_cs+2.*tcs)./2.*mu).*besselj(1,q.*(r_core_cs+tcs).*sqrt(1-mu.^2))./(q.*(r_core_cs+tcs).*sqrt(1-mu.^2))+...
    2.*(rho_core_cs-rho_shell_cs).*V_core_cs.*(sin(q.*L_core_cs./2.*mu))./(q.*L_core_cs./2.*mu).*besselj(1,q.*r_core_cs.*sqrt(1-mu.^2))./(q.*r_core_cs.*sqrt(1-mu.^2))].^2;

f2=@(q) quad(@(mu) f(q,mu),0,1);
 


Zuletzt bearbeitet von bluesaturn am 03.02.2014, 15:35, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 03.02.2014, 15:19     Titel:
  Antworten mit Zitat      
was klappt denn bei

Code:

f=@(q,mu) [2.*(rho_shell_cs-rho_solvent_cs).*V_shell_cs.*sin(q.*(L_core_cs+2.*tcs)./2.*mu)./(q.*(L_core_cs+2.*tcs)./2.*mu).*besselj(1,q.*(r_core_cs+tcs).*sqrt(1-mu.^2))./(q.*(r_core_cs+tcs).*sqrt(1-mu.^2))+...
    2.*(rho_core_cs-rho_shell_cs).*V_core_cs.*(sin(q.*L_core_cs./2.*mu))./(q.*L_core_cs./2.*mu).*besselj(1,q.*r_core_cs.*sqrt(1-mu.^2))./(q.*r_core_cs.*sqrt(1-mu.^2))].^2;
f2=@(q) quad(@(mu) f(q,mu),0,1);

nicht?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
bluesaturn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2014, 15:40     Titel:
  Antworten mit Zitat      
Erstmal habe ich oben die [] gegen () ausgetauscht.

Für
Code:

q=[1e-3:5e-1:10]
f=@(q,mu) (2.*(rho_shell_cs-rho_solvent_cs).*V_shell_cs.*sin(q.*(L_core_cs+2.*tcs)./2.*mu)./(q.*(L_core_cs+2.*tcs)./2.*mu).*besselj(1,q.*(r_core_cs+tcs).*sqrt(1-mu.^2))./(q.*(r_core_cs+tcs).*sqrt(1-mu.^2))+...
    2.*(rho_core_cs-rho_shell_cs).*V_core_cs.*(sin(q.*L_core_cs./2.*mu))./(q.*L_core_cs./2.*mu).*besselj(1,q.*r_core_cs.*sqrt(1-mu.^2))./(q.*r_core_cs.*sqrt(1-mu.^2))).^2;

f2=@(q) quad(@(mu) f(q,mu),0,1);

loglog(q,f2(q));

 


Bekomme ich als Fehlermeldung:

Code:

??? Error using ==> times
Matrix dimensions must agree.

Error in ==>
@(q,alpha)(2.*(rho_shell_cs-rho_solvent_cs).*V_shell_cs.*sin(q.*(L_core_cs+2.*tcs)./2.*alpha)./(q.*(L_core_cs+2.*tcs)./2.*alpha).*besselj(1,q.*(r_core_cs+tcs).*sqrt(1-alpha.^2))./(q.*(r_core_cs+tcs).*sqrt(1-alpha.^2))+2.*(rho_core_cs-rho_shell_cs).*V_core_cs.*(sin(q.*L_core_cs./2.*alpha))./(q.*L_core_cs./2.*alpha).*besselj(1,q.*r_core_cs.*sqrt(1-alpha.^2))./(q.*r_core_cs.*sqrt(1-alpha.^2))).^2


Error in ==> @(alpha)f(q,alpha)


Error in ==> quad at 77
y = f(x, varargin{:});

Error in ==> @(q)quad(@(alpha) f(q,alpha),0,1)


Error in ==> Versuch7_PB_CSC_combined at 68
loglog(q,f2(q));
 


Ich möchte noch anmerken, dass wenn ich f für ein bestimmtes alpha evaluiere (einfach ausrechnen lasse ohne Integration), bekomme ich die gleichen Dimensionen wie für q.
Private Nachricht senden Benutzer-Profile anzeigen
 
bluesaturn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2014, 16:45     Titel:
  Antworten mit Zitat      
Eine anderes Integral lautet wie folgt:
Hier steht ein Text, den man im Zitat sehen kann.
Keine Ahnung, warum die Matheumgebung das jetzt nicht anzeigt. Im Editor ist der Ausdruck da.


<br />
\int_0^1 \! \, d\mu [L \frac{sin(q\mu L/2)}{(q\mu L/2)} *\int_0^\infty \! \Delta\rho(r_c) J_0[qr_c\sqrt{1-\mu^2}]2\pi r_c \, dr_c ]^2
<br />

Bekäme man sowas auch irgendwie in Matlab hin? Ich glaube, ich kann nicht die quad-Funktion nehmen, weil ich nicht an das \mu rankomme, um dies in das innere Integral zu stecken.
q ist wieder ein Vektor mit 1x20 Einträgen z.B., also muss ich für jedes q das Integral ausrechnen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 03.02.2014, 17:11     Titel:
  Antworten mit Zitat      
mal versucht ne schleife über da q laufen zu lassen? kann mich erinner auchmal so ein probelm gehabt zu haben. oder kommt für ein einzelnes q also f2(1) auch so ein fehler ?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
bluesaturn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2014, 17:36     Titel:
  Antworten mit Zitat      
Winkow hat Folgendes geschrieben:
mal versucht ne schleife über da q laufen zu lassen? kann mich erinner auchmal so ein probelm gehabt zu haben. oder kommt für ein einzelnes q also f2(1) auch so ein fehler ?


Ja, daran dachte ich auch gerade.
Ich habe gerade gelesen, dass die anonyme-Funktion nur einzelne Werte zurückgibt (siehe: http://pundit.pratt.duke.edu/wiki/MATLAB:Anonymous_Function
"Anonymous functions can only have one expression and can only return a single variable (though that variable can be a matrix)."
Ich verstehe nicht, warum man eine anonyme Funktion nicht mit einem Vektor füttern kann.

Beispielcode, der funzt:

Code:




 q=[1:1:10]


f=@(q,mu)(q+mu)
f2=@(q) quad(@(mu) f(q,mu),0,1);

empty_vector=[];
for i=1:size(q,2)
result=f2(q(1,i))
empty_vector=[empty_vector,result]
end
 

Damit ist das Problem aus dem ersten Beitrag gerade gelöst.

Winkow, hättest du vielleicht einen Hinweis, wie das mit der quad oder quad2d funktionieren könnte, wenn im Integranden noch ein Integral steckt, wo aber auch die Variabel des äußeren Integrals drin vorkommt?

Das wäre dann z.B:

<br />
g(q)=\int_0^1 d\mu \, [\! f(q,\mu)  \int_0^\infty \! h(q,\mu,r_c) \, dr_c ]^2
<br />
Private Nachricht senden Benutzer-Profile anzeigen
 
bluesaturn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2014, 21:22     Titel:
  Antworten mit Zitat      
Ich versuche mich gerade an einem Testbeispiel für Fall 2.
Code:


q=[1:1:10]

f0=@(q,mu,r)q.*r.*mu;


f1=@(q,mu)(q.*mu.*quad(@(r)f0(q,mu,r),0,1)).^2;
f4=@(q)quad(@(mu)f1(q,mu),0,1);


Für f1(1,1) bekomme ich noch etwas heraus, für f2 nicht.
Die Lösung sollte eigentlich q^4/20 sein.
Aber f4 kann Matlab nicht ausrechnen.
Seht ihr zufällig den Fehler, bitte?
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 - 2025 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.