Asked by AP
on 30 Oct 2012

Dea All,

I have the following function whose definition needs an integral to be evaluated. The integral itself is dependent on the function input variables.

r0 = 0.5; z0 = 0.5; G(r,z,z-z0) = 1/2*r*r0^2 * integral(cos(lambda)/sqrt((r^2+r0^2-2*r*r0*cos(lambda)+(z-z0)^2)) dlambda, -pi, pi);

Could someone please help me how I can get for example G(0.75, 0.75, 0.25)? My final goal is to find G over a rectangular meshgrid.

Thanks,

Ahmad

*No products are associated with this question.*

Answer by Matt J
on 30 Oct 2012

Create an anonymous function for the integrand as a function of lambda

G=@(r,z,z-z0) 1/2*r*r0^2 * integral(@(lambda) cos(lambda)/sqrt((r^2+r0^2-2*r*r0*cos(lambda)+(z-z0)^2)) , -pi, pi);

Show 2 older comments

AP
on 30 Oct 2012

This is the new definition:

r0=0.5; z0=0.5; G=@(r,z,z_minus_z0) 1/2*r*r0^2 * integral(@(lambda) cos(lambda)/sqrt((r^2+r0^2-2*r*r0*cos(lambda)+z_minus_z0^2)) , -pi, pi); feval(G, 0.75, 0.75, 0.25)

Matt J
on 30 Oct 2012

I don't see z anywhere on the RHS. Why not just have

G=@(r,z_minus_z0)

Matt J
on 30 Oct 2012

Replace all the * and / by elementwise operations .* and ./

G=@(r,z,z_minus_z0) 1/2.*r.*r0^2 .* ... integral(@(lambda) cos(lambda)./sqrt((r.^2+r0.^2-2.*r.*r0.*cos(lambda)+z_minus_z0.^2)) , -pi, pi);

Answer by Star Strider
on 30 Oct 2012

You need to ‘vectorize’ it:

r0 = 0.5; z0 = 0.5; r = 1; z = 1; G = @(r,z,z0) 1/2.*r.*r0.^2 .* integral(@(lambda) cos(lambda)./sqrt((r.^2+r0.^2-2.*r.*r0.*cos(lambda)+(z-z0).^2)) , -pi, pi);

G(r,z,z0)

AP
on 30 Oct 2012

Thank @Star Strider. I decided to put all the variables into the functioin definition and did very similar to what you did. I don't know why it does not evaluate G.

r0 = 0.5; z0 = 0.5; r = 1; z = 1; G=@(r, r0, z, z0) 1/2*r*r0^2 * integral(@(lambda) cos(lambda)/sqrt((r^2+r0^2-2*r*r0*cos(lambda)+(z-z0)^2)) , -pi, pi); G(r,r0,z,z0)

I get this error:

Error using integralCalc/finalInputChecks (line 515) Output of the function must be the same size as the input. If FUN is an array-valued integrand, set the 'ArrayValued' option to true.

AP
on 30 Oct 2012

Thanks all. Runs perfectly with elementwise operations.

r0 = 0.5; z0 = 0.5; r = 1; z = 1; G=@(r, r0, z, z0) 1/2.*r.*r0^2 .* integral(@(lambda) cos(lambda)./sqrt((r.^2+r0.^2-2*r.*r0.*cos(lambda)+(z-z0).^2)) , -pi, pi); G(r,r0,z,z0) ans =

0.1390

Star Strider
on 30 Oct 2012

You have to vectorize it using the ‘dot’ operators:

G = @(r, r0, z, z0) 1/2.*r.*r0.^2 .* integral(@(lambda) cos(lambda)./sqrt((r.^2+r0.^2-2.*r.*r0.*cos(lambda)+(z-z0).^2)) , -pi, pi);

See if that works as you want it to.

Related Content

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply Today
## 0 Comments