Questions with integral2 , Double, Syms and Dot calucations.

조회 수: 1 (최근 30일)
sun
sun 2014년 12월 27일
댓글: Xinyue Liu 2018년 5월 4일
Dear friends, I got 2 questions here. 1. If I have y = a*x^2 + 5. What function can make it into y = a.*x.^2 +5. As you seen, dot was inserted.
2. It's easy, but kinda diffcult to describe, but please have patience with me. Thank you so much. First, let me make a very simple example of my problem. If I want to calucate Y = F(x=1)+ 2.^2, and I know F(x=1) = a+b,(a and b are syms). This means Y = a + b + 4. Problem is here, Matlab give me error if I write down as.
F = function( .... ); <==== output of function is F(X=1), and = *F(x=1)* = a+b
Y = integral2( F + 2.^2, .. , .. ,..)
However, if I just copy the output of F as
Y = integral2( a+b + 2.^2, .. , .. ,..)
Now it works!!!
Ok. Please allow me to talk about my code here. I am trying to find a double interation by using integral2. One part of my equcation(which is Y) is from another int output(which is F). Matlab will give ERROR for code below:
clear all;
a=4;
la1=1/(pi*500^2); la2= la1*5;
p1=25; p2=p1/25;
sgma2=10^(-11);
index=1;
g=2./a;
syms r u1 u2
powe= -2 ;
seta= 10^powe;
xNor = ( (u2./u1).^(a./2) + 1 ).^(2./a);
x = (xNor).^(0.5) * seta^(-1/a);
fun1 = r./(1+ r.^a );
out1 = int(fun1, x, Inf) ; %== This is my F in my example
q=pi.*(la1.*p1.^(2./a)+la2.*p2.^(2./a));
yi = @(u2,u1) exp(-u2.*(1+2.*...
( out1 )./... %=== out1 is the problem here.
( (( (u2./u1).^(a./2) + 1 ).^(2./a)).*seta.^(-2./a)))).*...
exp(-sgma2.*q.^(-a./2).* seta.*u2.^(a./2)./...
((( (u2./u1).^(a./2) + 1 ).^(2./a)).^(a./2)) );
maxF =@(u2) u2;
out2 = integral2(yi,0,Inf,0 ,maxF) % == this is Y in my previous example.
However, since I know the out1 = pi/4 - atan(10*(u2^2/u1^2 + 1)^(1/2))/2 (no dot,1/2, not 1./2). Instead of writing down out1, I will just type the equaction and add dot in the
yi = @(u2,u1) exp(-u2.*(1+2.*...
( pi./4 - atan(10.*(u2.^2./u1.^2 + 1).^(1./2))./2 )./... %===not "out1"
( (( (u2./u1).^(a./2) + 1 ).^(2./a)).*seta.^(-2./a)))).*...
exp(-sgma2.*q.^(-a./2).* seta.*u2.^(a./2)./...
((( (u2./u1).^(a./2) + 1 ).^(2./a)).^(a./2)) );
Now the code is working!!!! The final output is = 0.9957. Dear friends, I already spend a long time on this, but I still can not find out the problem. Could you please take a deeper look for me. Please copy the code to you matlab and test. Thank you so much.
Below is the error given by matlab, if I just use "out1" in yi = @(u2,u1) ......
Error using integralCalc/finalInputChecks (line 511)
Input function must return 'double' or 'single' values. Found 'sym'.
Error in integralCalc/iterateScalarValued (line 315)
finalInputChecks(x,fx);
Error in integralCalc/vadapt (line 133)
[q,errbnd] = iterateScalarValued(u,tinterval,pathlen);
Error in integralCalc (line 76)
[q,errbnd] = vadapt(@AtoBInvTransform,interval);
Error in
integral2Calc>@(xi,y1i,y2i)integralCalc(@(y)fun(xi*ones(size(y)),y),y1i,y2i,opstruct.integralOptions)
(line 18)
innerintegral = @(x)arrayfun(@(xi,y1i,y2i)integralCalc( ...
Error in
integral2Calc>@(x)arrayfun(@(xi,y1i,y2i)integralCalc(@(y)fun(xi*ones(size(y)),y),y1i,y2i,opstruct.integralOptions),x,ymin(x),ymax(x))
(line 18)
innerintegral = @(x)arrayfun(@(xi,y1i,y2i)integralCalc( ...
Error in integralCalc/iterateScalarValued (line 314)
fx = FUN(t);
Error in integralCalc/vadapt (line 133)
[q,errbnd] = iterateScalarValued(u,tinterval,pathlen);
Error in integralCalc (line 84)
[q,errbnd] = vadapt(@AToInfInvTransform,interval);
Error in integral2Calc>integral2i (line 21)
[q,errbnd] = integralCalc(innerintegral,xmin,xmax,opstruct.integralOptions);
Error in integral2Calc (line 8)
[q,errbnd] = integral2i(fun,xmin,xmax,ymin,ymax,optionstruct);
Error in integral2 (line 107)
Q = integral2Calc(fun,xmin,xmax,yminfun,ymaxfun,opstruct);
Error in ref7_equ11n2 (line 129)
out2 = integral2(yi,0,Inf,0 ,maxF)

채택된 답변

Mike Hosea
Mike Hosea 2014년 12월 27일
The problem is that out1 is a symbolic "thing", not a MATLAB "thing". That's what the error message is really telling you. You need to use
out1fcn = matlabFunction(out1);
Then, in your integrand, instead of typing just "out1", type
out1fcn(u1,u2)
Like so:
out1 = int(fun1, x, Inf) ; %== This is my F in my example
out1fcn = matlabFunction(out1); % Convert symbolic object to a MATLAB function.
q=pi.*(la1.*p1.^(2./a)+la2.*p2.^(2./a));
yi = @(u2,u1) exp(-u2.*(1+2.*...
( out1fcn(u1,u2) )./... %=== out1 is the problem here.
( (( (u2./u1).^(a./2) + 1 ).^(2./a)).*seta.^(-2./a)))).*...
exp(-sgma2.*q.^(-a./2).* seta.*u2.^(a./2)./...
((( (u2./u1).^(a./2) + 1 ).^(2./a)).^(a./2)) );
maxF =@(u2) u2;
out2 = integral2(yi,0,Inf,0 ,maxF) % == this is Y in my previous example.
  댓글 수: 6
sun
sun 2014년 12월 29일
Thank you very much, Mike:)
Xinyue Liu
Xinyue Liu 2018년 5월 4일
I have the same problem with sun. Thank you so much to solve this, Mike;)

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Numbers and Precision에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by