user27182
user27182

Reputation: 200

Is this function handle too long for MATLAB to integrate?

I have written the following code in order to try to plot the following integral against values of r, but MATLAB gives me an error -- is fun too long? am I going wrong somewhere else?

 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

The error I get is

        Error using  *  Inner matrix dimensions must agree. 

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


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

Upvotes: 0

Views: 171

Answers (1)

fpe
fpe

Reputation: 2750

I'll show you a way you may proceed, based on a retained r and fun (I did not pick all the terms of the native function):

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

Since your r is quite huge (50001 elements if I remember right), I'd go for parfor insted of simple for loop, too.

EDIT

As alternative solution, you could achieve the same results without any anonymous function, by following this way:

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

Upvotes: 1

Related Questions