2016-08-07 15 views
0

Ich möchte Gauss-Legendre Quadratur verwenden, um ein Doppelintegral zu bewerten. Ich kam mit dem folgenden CodeDoppelte Integration mit Gauss-Legendre Quadratur

m=5000; 

%generate weights and abscissas 
[wx,xx]=leg(-1,1,m); 
[wy,xy]=leg(-1,1,m); 

%define function 
[email protected](x,y) hypergeom(-1./4,3./2,x.^2.*y.^6); 


%integrate with respect to x 
intx=zeros(1,m); 
for num=1:m 
    intx(num)=sum(wx.*psi(xx,yx(num))); 
end 

sum(wy.*intx) 

Ich benutze die Schreibweise Bein (x1, x2, m) die Gewichte und abscissas zur Erzeugung von bis.

Gibt es eine andere Möglichkeit, diesen Code schneller auszuführen?

+1

Warum Sie definieren nicht die psi außerhalb der for-Schleife? Trotzdem sollte dies nicht Ihr Engpass sein. Haben Sie versucht, Ihren Code zu erstellen? Sie können es über den Button "Run and time" erreichen. –

+0

Wenn ich psi außerhalb der for lopp stelle, tritt ein Fehler auf. Es sagt, dass die vatiable y ist undefined – PhilCsar

+0

versuchte Ihren Vorschlag, aber der Code läuft immer noch sehr langsam – PhilCsar

Antwort

1

unter der Annahme, daß w ein Zeilenvektor ist y Sie meshgrid replizieren können, x und dann Multiplikationsmatrix:

m = 5000; 
[w,x]=leg(-1,1,m); 
[X, Y] = meshgrid(x); 
[email protected](x,y) hypergeom(-1./4,3./2,x.^2.*y.^6); 
result = w * psi(X,Y) * w'; 
+0

danke! Zusatzfrage: Was passiert, wenn ich unterschiedliche Grenzen habe? der erste von -1 bis 1 und der zweite von 1 bis 3? – PhilCsar

+0

bleibt als Übung für dich :-). aber als Anleitung können Sie Meshgrid als meshgrdi (xx, yy) schreiben und Sie haben wx und wy – rahnema1