我需要數值評估一些積分;這些都是在該圖像中所示的形式的正弦:矢量的雙for循環包括兩個變量
這些積分是N x N
矩陣的矩陣元素,所以我需要以評估它們的所有可能的組合n
和m
的範圍爲1
到N
。積分是n
和m
對稱的,我在我目前的嵌套for
環方案已經實施:
function [V] = coulomb3(N, l, R, R0, c, x)
r1 = 0.01:x:R;
r2 = R:x:R0;
r = [r1 r2];
rl1 = r1.^(2*l);
rl2 = r2.^(2*l);
sines = zeros(N, length(r));
V = zeros(N, N);
for i = 1:N;
sines(i, :) = sin(i*pi*r/R0);
end
x1 = length(r1);
x2 = length(r);
for nn = 1:N
for mm = 1:nn
f1 = (1/6)*rl1.*r1.^2.*sines(nn, 1:x1).*sines(mm, 1:x1);
f2 = ((R^2/2)*rl2 - (R^3/3)*rl2.*r2.^(-1)).*sines(nn, x1+1:x2).*sines(mm, x1+1:x2);
value = 4*pi*c*x*trapz([f1 f2]);
V(nn, mm) = value;
V(mm, nn) = value;
end
end
我想,在循環中調用sin(x)
是個壞主意,所以我計算所有需要的值,並將其儲存。爲了評估積分我使用trapz
,但由於第一和第二/第三積分有不同的範圍,功能值需要分開計算,然後組合。
我試過了幾種不同的矢量化方法,但唯一能給出正確結果的方法比上面的循環花費的時間要長得多(使用gmultiply
但創建的數組很有效)。我也做了一個解析解(假設m
和n
是整數和R0 > R > 0
),但這些解決方案包含一個餘弦積分(MATLAB中的cosint
)函數,對於大的N
來說,這個函數非常慢。
我不確定整個事情可以矢量化而不創建非常大的數組,但內部循環至少應該是可能的。任何想法將不勝感激!
我目前使用的輸入是:
使用這些值
V(1, 1:3) = 873,379900963549 -5,80688363271849 -3,38139152472590
雖然對角線值永遠不會隨R0因此它們更有趣的收斂。
您發佈的代碼是否爲計算提供了正確的結果? –
間距爲0.01,這些數值非常接近我在Maple中分析計算的幾個樣本,所以我確信它會給出正確的結果。 –
好的。你能舉一些合理的投入的例子嗎? –