我正在尝试在s
,gamma1
,gamma2
上执行数字三重积分。限制分别为(-inf +int)
,(0,+inf)
和(gamma1,+inf)
。请不要害怕我的功能形状(它只是gamma1
,gamma2
,s
)的函数
以下是我的代码
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'.
有什么建议吗?
非常感谢!
答案 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并查看解决方案的变化程度,如果变化很小,那么您可以确信答案非常准确,否则您必须增加数量并等待更长时间!你的功能衰退得越快,你就可以越小的界限。