2013-04-30 3 views
0

J'ai écrit le code suivant afin d'essayer de tracer l'intégrale suivante contre les valeurs de r, mais MATLAB me donne une erreur - est-ce amusant trop longtemps? est-ce que je vais mal ailleurs?Cette fonction est-elle trop longue pour l'intégration de MATLAB?

figure(1); %f_1 
    r = 0:0.001:50; 
    q = zeros(1, size(r)); 
    for m = 1:numel(r) 
     fun = @(t) ((-3*(r(m).^3)*sin(3*t) + 2*(r(m)^2)*cos(2*t) + 7*r(m)*cos(t) -2*sin(t))*(-6*(r(m)^3)*sin(3*t) + 2*(r(m)^3)*cos(3*t) - 3*(r(m)^4)*cos(4*t) - 2*(r(m)^3)*sin(3*t) + 2*(r(m)^2)*cos(2*t) + 7*(r(m)^2)*sin(2*t))) - ((3*(r(m).^3).*cos(3*t) + 2*(r(m).^2).*sin(2*t) + 7*r(m).*sin(t) - 2*r(m).*cos(t))*(-6*(r(m).^3).*cos(3*t) + 2*(r(m).^3).*sin(3*t) + 3*(r(m).^4).*sin(4*t) - 2* (r(m).^3).*cos(3*t) - 2*(r(m).^2).*sin(2*t) + 7*(r(m).^2).*cos(2*t)))./((-3*(r(m).^3).*sin(3.*t) + 2*(r(m).^2)*cos(2.*t) + 7*r(m).*cos(t) - 2*sin(t)).^2 + (3*(r(m).^3).*cos(3*t) + 2*(r(m).^2).*sin(2*t) + 7*r(m).*sin(t) - 2*r(m).*cos(t)).^2); 
     q(m) = quad(fun, 0, 2*pi); 
end 

L'erreur que je reçois est

 Error using * Inner matrix dimensions must agree. 

Error in @(t)...... 


Error in quad (line 76) y = f(x, varargin{:}); 
+0

Quelle est l'erreur? – Dan

+0

@Dan. Je pense que je devais juste utiliser une version vectorisée de quad. – user27182

+0

@Dan. En fait, cela prend beaucoup trop de temps. – user27182

Répondre

1

Je vais vous montrer une façon que vous pouvez procéder, sur la base d'un RÉPARTIS r et fun (je ne ramassez pas tous les termes de la fonction native) :

r = 0:0.1:50; 
q = zeros(size(r)); 

for ii = 1:numel(r) 
    fun = @(t) (-3.*(r(ii).^3).*sin(3.*t) + 2.*(r(ii).^2).*cos(2.*t) + 7.*r(ii).*cos(t) -2.*sin(t)); 
    q(ii) = quad(fun,0,2.*pi); 
end 

Depuis votre r est assez énorme (50001 éléments si je me souviens bien), je vais pour parfor insted de sim ple for boucle, aussi.

EDIT

Comme solution de rechange, vous pouvez obtenir les mêmes résultats sans , en suivant la façon suivante:

r = 0:.01:50; 
fun1 = zeros(size(r)); 
t = 0:.001:(2*pi); 
for ii = 1:numel(r) 
    fun1(ii) = trapz(t,(-3.*(r(ii).^3).*sin(3.*t) + 2.*(r(ii).^2).*cos(2.*t) + 7.*r(ii).*cos(t) -2.*sin(t))); 
end