Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ガウス・ラゲール求積の評価点と重み

この例では、Symbolic Math Toolbox™ を使って多項方程式と方程式系を解き、その結果を処理する方法を説明します。

ガウス求積法は、和による積分の近似 abf(t)w(t)dti=1nf(xi)αi です。ここで、xi および αi は方式のパラメーターで、n に依存しますが、f には依存しません。これらは、選択した重み関数 w(t) から次のように得られます。重み関数には直交多項式族が関連しています。多項式の根は評価点 xi です。最後に、重み αi は、低次数の多項式の場合にこの方式が正しくなるという条件で決まります。区間 [0,] での重み関数 w(t)=exp(-t) を考えます。これはガウス・ラゲール求積として知られています。

syms t
n = 4;
w(t) = exp(-t);

直交多項式族の最初の n メンバーがわかっているとします。ここで考慮されている求積法の場合、これらがラゲール多項式であることがわかります。

F = laguerreL(0:n-1, t)
F = 

(11-tt22-2t+1-t36+3t22-3t+1)

n+1 次多項式である L を考えます。係数は未定です。

X = sym('X', [1, n+1])
X = (X1X2X3X4X5)
L = poly2sym(X, t)
L = X1t4+X2t3+X3t2+X4t+X5

ラゲール多項式 F および L の直交関係を方程式系 sys で表現します。

sys = [int(F.*L.*w(t), t, 0, inf) == 0]
sys = (24X1+6X2+2X3+X4+X5=0-96X1-18X2-4X3-X4=0144X1+18X2+2X3=0-96X1-6X2=0)

多項式のノルムが 1 であるという条件を追加します。

sys = [sys, int(L^2.*w(t), 0, inf) == 1]
sys = (24X1+6X2+2X3+X4+X5=0-96X1-18X2-4X3-X4=0144X1+18X2+2X3=0-96X1-6X2=040320X12+10080X1X2+1440X1X3+240X1X4+48X1X5+720X22+240X2X3+48X2X4+12X2X5+24X32+12X3X4+4X3X5+2X42+2X4X5+X52=1)

L の係数の解を求めます。

S = solve(sys, X)
S = struct with fields:
    X1: [2x1 sym]
    X2: [2x1 sym]
    X3: [2x1 sym]
    X4: [2x1 sym]
    X5: [2x1 sym]

solve は 2 つの解を構造体配列で返します。解を表示します。

structfun(@display, S)
ans = 

(-124124)

ans = 

(23-23)

ans = 

(-33)

ans = 

(4-4)

ans = 

(-11)

最初の係数は正であるという追加の条件を追加して、解を一意にします。

sys = [sys, X(1)>0];
S = solve(sys, X)
S = struct with fields:
    X1: 1/24
    X2: -2/3
    X3: 3
    X4: -4
    X5: 1

解を L に代入します。

L = subs(L, S)
L = 

t424-2t33+3t2-4t+1

予想どおり、この多項式は |n| 次のラゲール多項式です。

laguerreL(n, t)
ans = 

t424-2t33+3t2-4t+1

評価点 xi は多項式 L の根です。この評価点について L を解きます。根は、関数 root で表現されます。

x = solve(L)
x = 

(root(σ1,z,1)root(σ1,z,2)root(σ1,z,3)root(σ1,z,4))where  σ1=z4-16z3+72z2-96z+24

これらの解の形式は、何も成立していないことを示している場合もありますが、これらについてのさまざまな演算は利用可能です。vpa を使用して浮動小数点近似を計算します。

vpa(x)
ans = 

(0.322547689619392311800361459104371.74576110115834657568681671251794.53662029692112798327928538495719.3950709123011331292335364434205)

疑似的な虚数部が発生する可能性があります。根が実数であることをシンボリックに証明します。

isAlways(in(x, 'real'))
ans = 4x1 logical array

   1
   1
   1
   1

4 次以下の多項式の場合、MaxDegree を使用して、root ではなく入れ子にされた累乗根で解が得られます。ただし、この形式の結果に対するそれ以降の演算は遅くなります。

xradical = solve(L, 'MaxDegree', 4)
xradical = 

(4-σ1-σ34+σ1-σ3σ3-σ2+4σ3+σ2+4)where  σ1=96σ6σ4-3σ5σ4-288σ4-512366+36i2768+12836i1/6144σ6+9σ5+8641/4  σ2=96σ6σ4-3σ5σ4-288σ4+512366+36i2768+12836i1/6144σ6+9σ5+8641/4  σ3=σ42768+12836i1/6  σ4=16σ6+σ5+96  σ5=768+12836i2/3  σ6=768+12836i1/3

重み αi は、多項式が n 次未満の場合、求積法により必ず厳密な結果を得られるという条件で与えられます。これがこれらの多項式のベクトル空間の基底に当てはまる場合には、これで十分です。この条件は、4 変数の 4 つの方程式から成る系になります。

y = sym('y', [n, 1]);
sys = sym(zeros(n));
for k=0:n-1 
    sys(k+1) = sum(y.*(x.^k)) == int(t^k * w(t), t, 0, inf); 
end
sys
sys = 

(y1+y2+y3+y4=1000y1root(σ1,z,1)+y2root(σ1,z,2)+y3root(σ1,z,3)+y4root(σ1,z,4)=1000y1root(σ1,z,1)2+y2root(σ1,z,2)2+y3root(σ1,z,3)2+y4root(σ1,z,4)2=2000y1root(σ1,z,1)3+y2root(σ1,z,2)3+y3root(σ1,z,3)3+y4root(σ1,z,4)3=6000)where  σ1=z4-16z3+72z2-96z+24

数値的およびシンボリックに系を解きます。解は重み αi の目的のベクトルです。

[a1, a2, a3, a4] = vpasolve(sys, y)
a1 = 0.60315410434163360163596602381808
a2 = 0.35741869243779968664149201745809
a3 = 0.03888790851500538427243816815621
a4 = 0.00053929470556132745010379056762059
[alpha1, alpha2, alpha3, alpha4] = solve(sys, y)
alpha1 = 

-σ3σ2+σ3σ1+σ2σ1-σ3σ2σ1-2σ3-2σ2-2σ1+6σ4-σ3σ4σ2+σ4σ1-σ2σ1-σ42where  σ1=root(z4-16z3+72z2-96z+24,z,4)  σ2=root(z4-16z3+72z2-96z+24,z,3)  σ3=root(z4-16z3+72z2-96z+24,z,2)  σ4=root(z4-16z3+72z2-96z+24,z,1)

alpha2 = 

root(σ1,z,1)root(σ1,z,3)+root(σ1,z,1)root(σ1,z,4)+root(σ1,z,3)root(σ1,z,4)-root(σ1,z,1)root(σ1,z,3)root(σ1,z,4)-2root(σ1,z,1)-2root(σ1,z,3)-2root(σ1,z,4)+6root(σ1,z,2)-root(σ1,z,1)root(σ1,z,2)-root(σ1,z,3)root(σ1,z,2)-root(σ1,z,4)where  σ1=z4-16z3+72z2-96z+24

alpha3 = 

σ3σ2+σ3σ1+σ2σ1-σ3σ2σ1-2σ3-2σ2-2σ1+6σ4-σ1σ3σ2-σ3σ4-σ2σ4+σ42where  σ1=root(z4-16z3+72z2-96z+24,z,4)  σ2=root(z4-16z3+72z2-96z+24,z,2)  σ3=root(z4-16z3+72z2-96z+24,z,1)  σ4=root(z4-16z3+72z2-96z+24,z,3)

alpha4 = 

-σ3σ2+σ3σ1+σ2σ1-σ3σ2σ1-2σ3-2σ2-2σ1+6σ42σ3+σ42σ2+σ42σ1-σ43+σ3σ2σ1-σ3σ2σ4-σ3σ1σ4-σ2σ1σ4where  σ1=root(z4-16z3+72z2-96z+24,z,3)  σ2=root(z4-16z3+72z2-96z+24,z,2)  σ3=root(z4-16z3+72z2-96z+24,z,1)  σ4=root(z4-16z3+72z2-96z+24,z,4)

また、出力引数を 1 つだけ指定することで、解を構造体として得ることもできます。

S = solve(sys, y)
S = struct with fields:
    y1: -(root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 2)*root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 3) + root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 2)*root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 4) + root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 3)*root(z...
    y2: (root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 1)*root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 3) + root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 1)*root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 4) + root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 3)*root(z^...
    y3: (root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 1)*root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 2) + root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 1)*root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 4) + root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 2)*root(z^...
    y4: -(root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 1)*root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 2) + root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 1)*root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 3) + root(z^4 - 16*z^3 + 72*z^2 - 96*z + 24, z, 2)*root(z...

structfun(@double, S)
ans = 4×1

    0.6032
    0.3574
    0.0389
    0.0005

構造体 S をシンボリック配列に変換します。

Scell = struct2cell(S);
alpha = transpose([Scell{:}])
alpha = 

(-σ3+σ15+σ2-σ6-σ12-σ11-σ10+6root(σ16,z,1)-root(σ16,z,2)σ1+σ4-σ2-root(σ16,z,1)2σ1+σ4+σ2-σ7-σ13-σ11-σ10+6root(σ16,z,2)-root(σ16,z,1)root(σ16,z,2)-root(σ16,z,3)root(σ16,z,2)-root(σ16,z,4)σ5+σ4+σ15-σ8-σ13-σ12-σ10+6root(σ16,z,3)-root(σ16,z,4)σ5-σ1-σ3+root(σ16,z,3)2-σ5+σ1+σ3-σ9-σ13-σ12-σ11+6σ14root(σ16,z,1)+σ14root(σ16,z,2)+σ14root(σ16,z,3)-root(σ16,z,4)3+σ9-σ8-σ7-σ6)where  σ1=root(σ16,z,1)root(σ16,z,3)  σ2=root(σ16,z,3)root(σ16,z,4)  σ3=root(σ16,z,2)root(σ16,z,3)  σ4=root(σ16,z,1)root(σ16,z,4)  σ5=root(σ16,z,1)root(σ16,z,2)  σ6=root(σ16,z,2)root(σ16,z,3)root(σ16,z,4)  σ7=root(σ16,z,1)root(σ16,z,3)root(σ16,z,4)  σ8=root(σ16,z,1)root(σ16,z,2)root(σ16,z,4)  σ9=root(σ16,z,1)root(σ16,z,2)root(σ16,z,3)  σ10=2root(σ16,z,4)  σ11=2root(σ16,z,3)  σ12=2root(σ16,z,2)  σ13=2root(σ16,z,1)  σ14=root(σ16,z,4)2  σ15=root(σ16,z,2)root(σ16,z,4)  σ16=z4-16z3+72z2-96z+24

シンボリックな解は複雑に見えます。これを単純化し、浮動小数点ベクトルに変換します。

alpha = simplify(alpha)
alpha = 

(root(σ1,z,1)272-29root(σ1,z,1)144+23root(σ1,z,2)272-29root(σ1,z,2)144+23root(σ1,z,3)272-29root(σ1,z,3)144+23root(σ1,z,4)272-29root(σ1,z,4)144+23)where  σ1=z4-16z3+72z2-96z+24

vpa(alpha)
ans = 

(0.603154104341633601635966023818080.357418692437799686641492017458090.038887908515005384272438168156210.00053929470556132745010379056762059)

alpha に現れる根 x を略語に置き換えて、可読性を高めます。

subs(alpha, x, sym('R', [4, 1]))
ans = 

(R1272-29R1144+23root(σ1,z1,2)272-29root(σ1,z1,2)144+23root(σ1,z1,3)272-29root(σ1,z1,3)144+23root(σ1,z1,4)272-29root(σ1,z1,4)144+23)where  σ1=z14-16z13+72z12-96z1+24

重みを合計して和が 1 であることを示します。

simplify(sum(alpha))
ans = 1

求積法の重みを求める別の方法は、式 αi=abw(t)jit-xjxi-xjdt を使用して計算することです。i=1 でこれを行います。これは、次のように別の方法と同じ結果となります。

int(w(t) * prod((t - x(2:4)) ./ (x(1) - x(2:4))), t, 0, inf)
ans = 

root(z4-16z3+72z2-96z+24,z,1)272-29root(z4-16z3+72z2-96z+24,z,1)144+23

求積法では、2n-1 次以下のすべての多項式に対しても厳密な結果が得られますが、t2n に対しては得られません。

simplify(sum(alpha.*(x.^(2*n-1))) -int(t^(2*n-1)*w(t), t, 0, inf))
ans = 0
simplify(sum(alpha.*(x.^(2*n))) -int(t^(2*n)*w(t), t, 0, inf))
ans = -576

余弦に求積法を適用し、厳密な結果と比較します。

vpa(sum(alpha.*(cos(x))))
ans = 0.50249370546067059229918484198931
int(cos(t)*w(t), t, 0, inf)
ans = 

12

余弦のべき乗では、奇数乗と偶数乗の間で誤差が振動します。

errors = zeros(1, 20);
for k=1:20 
    errors(k) = double(sum(alpha.*(cos(x).^k)) -int(cos(t)^k*w(t), t, 0, inf));
end
plot(real(errors))

Figure contains an axes object. The axes object contains an object of type line.