Matlab

2016-04-11 44 views
2

Ben örneğin, bazı integraller hesaplamak çalışıyorum bir çift sembolik ayrılmaz:Matlab

a = 1/sqrt(2); 
b = -5; 
c = 62; 
d = 1; 
f = exp(-x^2-y^2)*(erfc((sym(a) + 1/(x^2+y^2)*(sym(b)*x+sym(d)*y))*sqrt((x^2+y^2)*sym(10.^(c/10))))... 
       + erfc((sym(a) - 1/(x^2+y^2)*(sym(b)*x+sym(d)*y))*sqrt((x^2+y^2)*sym(10.^(c/10)))));  
h = int(int(f,x,-Inf,Inf),y,-Inf,Inf); 

Böyle hatayı ortaya çıkar:

Uyarı: Açık ayrılmaz bulunamadı.

Sonra ben

vpa(int(int(f,x,-Inf,Inf),y,-Inf,Inf),5) 
numeric::int(numeric::int(exp(- x^2 - y^2)*(erfc(((6807064429273519*x^2)/4294967296 + (6807064429273519*y^2)/4294967296)^(1/2)*(2^(1/2)/2 + (5*x - y)/(x^2 + y^2))) + erfc(((6807064429273519*x^2)/4294967296 + (6807064429273519*y^2)/4294967296)^(1/2)*(2^(1/2)/2 - (5*x - y)/(x^2 + y^2)))), x == -Inf..Inf), y == -Inf..Inf) 

Zaten [-Inf,Inf][-100,100] için sıklığını değiştirmek ve aynı yukarıdaki sonuca ulaşmaya çalıştığından ayrılmaz hesaplamak için vpa kullanın ve böyle bir sonuç elde etmeye çalışmak:

numeric::int(numeric::int(exp(- x^2 - y^2)*(erfc(((6807064429273519*x^2)/4294967296 + (6807064429273519*y^2)/4294967296)^(1/2)*(2^(1/2)/2 + (5*x - y)/(x^2 + y^2))) + erfc(((6807064429273519*x^2)/4294967296 + (6807064429273519*y^2)/4294967296)^(1/2)*(2^(1/2)/2 - (5*x - y)/(x^2 + y^2)))), x == -100..100), y == -100..100) 

Sorum şu anda bu durumda vpa gerçek bir değere dönüşülemiyor? Matlab kodunun üstünde bir sorun var mı? (Ben, bugüne kadar bugünü bulamadık) Yardımlarınız için şimdiden teşekkür ederiz.

cevap

1

Bu integral için analitik bir çözüm bulunması olası değildir, bu nedenle int kullanımı iyi bir seçim olmayabilir. Bazı durumlarda, sayısal bir çözüm için vpa kullanılabilir. Bu başarısız olduğunda (bir aramayı geri döndürerek) birkaç nedenden ötürü olabilir: integral mevcut olmayabilir, integral çok yavaş bir şekilde yakınsayabilir, tekillikler sorunlara neden olabilir, integralin yüksek salınımlı veya pürüzsüz olmayabilir, vs. Mathematica ayrıca bu ayrılmazlıkla mücadele eder.

Sen sayısal integral2 kullanarak ayrılmaz hesaplama deneyebilirsiniz:

a = 1/sqrt(2); 
b = -5; 
c = 62; 
d = 1; 
f = @(x,y)exp(-x.^2-y.^2).*(erfc((a + 1./(x.^2+y.^2).*(b*x+d*y)).*sqrt((x.^2+y.^2)*10^(c/10)))... 
      +erfc((a - 1./(x.^2+y.^2).*(b*x+d*y)).*sqrt((x.^2+y.^2)*10^(c/10)))); 
h = integral2(f,-Inf,Inf,-Inf,Inf) 

5.790631184403967 döndürür. Bu Mathematica'nın sayısal entegrasyonu ile NIntegrate'u karşılaştırır. Daha doğru değerler elde etmek için integral2 için daha küçük mutlak ve göreli toleranslar belirtebilirsiniz, ancak bu daha yavaş işlem süreleriyle sonuçlanacaktır.

+0

Yardımlarınız için çok teşekkür ederim. Ancak, daha fazla cevabınızı "Daha doğru değerler elde etmek için integral2 için daha küçük mutlak ve nispi toleranslar belirtebilirsiniz" cevabını açıklayabilir misiniz? Buradaki noktanı anlamadım. Sadece bir şey, örneğin, örneğin, c vektördür, yani, c = [50 52 54 56 58 60 62] (veya uzun bir vektör). "Integral2" yi nasıl kullanabiliriz? Çünkü zaten bir c vektörü için "integral2" yi arıyorum ve deneyin, ancak "integral2" nin bir vektörle çalışmadığı anlaşılıyor. –

+0

Toleranslar gittikçe, "integral2" belgelerine bakın. Örneğin, örneğin, integral2 (f, -Inf, Inf, -Inf, Inf, 'AbsTol', 1e-10, 'RelTol', 1e-10) 'seçeneklerini belirtebilirsiniz. 'C' vektörünün neyi temsil ettiğini bilmiyorum. Sadece c 'deki her eleman için integrali çözmek ister misiniz? Öyleyse, o zaman sadece bir 'for' döngüsü kullanın. – horchler

+0

Yardımlarınız için teşekkür ederiz. Yine de "for döngüsüne" bir çözüm getirdim. –