数值三重积分在哪里是错误的?

时间:2014-11-19 00:51:04

标签: matlab integral

我正在尝试在sgamma1gamma2上执行数字三重积分。限制分别为(-inf +int)(0,+inf)(gamma1,+inf)。请不要害怕我的功能形状(它只是gamma1gamma2s)的函数

以下是我的代码

syms s
syms gamma1
syms gamma2

fun=-(exp(-(28035689158432973*pi*gamma2^(2/3))/2305843009213693952)*
exp(-(pi*s*7120816246010697*i)/112589990684262400)*
(1/((pi*s*(4194304/gamma1^2 + 4194304/gamma2^2)*i)/(50*
(6144/gamma1 + 6144/gamma2)) + 1)^((3*(2048/gamma1 + 2048/gamma2)^2)
/(4194304/gamma1^2 + 4194304/gamma2^2)) - 1)
*(exp(-(pi^2*s*(log((-(gamma2*25*i)/(1024*pi*s))^(1/3) + 1)/3;


y=@(s,gamma1,gamma2)fun;
gamma2min=@(s,gamma1) gamma1;
prob=integral3(y,-inf,+inf,0,+inf,gamma2min,+inf)

我收到以下错误

Error using integralCalc/finalInputChecks (line 511)
Input function must return 'double' or 'single' values. Found 'sym'.

有什么建议吗?

非常感谢!

1 个答案:

答案 0 :(得分:2)

您可以使用quadgk以数字方式集成定义为

的函数
y=@(a,b,c) 1/abs(a^2+b^2+c^2+1);

(我曾经测试过我的答案)。

这很棘手,因为quadgk期望一个函数接受向量输入并返回一个函数值向量,但你可以通过使用大量的arrayfun来解决这个问题。 S:

R=@(s,gamma1) quadgk(@(gamma2) arrayfun(@(k) y(s,gamma1,k),gamma2),gamma1,Inf)
S=@(s) quadgk(@(gamma1) arrayfun(@(k) R(s,k),gamma1),0,Inf)
T=quadgk(@(s) arrayfun(@(k) S(k),s),-Inf,Inf)

但是!它很慢,我没耐心等待答案。因此,例如,将Inf-Inf限制替换为100和-100,您将得到答案。也许尝试使用50和-50并查看解决方案的变化程度,如果变化很小,那么您可以确信答案非常准确,否则您必须增加数量并等待更长时间!你的功能衰退得越快,你就可以越小的界限。