Квадратурные точки оценки Лагерра гаусса и веса

Этот пример показывает, как решить полиномиальные уравнения и системы уравнений, и работать с результатами с помощью Symbolic Math Toolbox™.

Гауссовы квадратурные правила аппроксимируют интеграл суммами abf(t)w(t)dti=1nf(xi)αi. Здесь, xi и αi параметры метода, в зависимости от n но не на f. Они следуют из выбора функции веса w(t), можно следующим образом. Сопоставленный к функции веса семейство ортогональных полиномов. Корни полиномов являются точками оценки xi. Наконец, веса αi убеждены условием, что метод правилен для полиномов маленькой степени. Рассмотрите функцию веса w(t)=exp(-t) на интервале [0,]. Этот случай известен как квадратуру Лагерра Гаусса.

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

Примите, что вы знаете первое n члены семейства ортогональных полиномов. В случае квадратурного правила, рассмотренного здесь, они оказываются полиномами Лагерра.

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

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

Позвольте L быть n+1 полином Св., коэффициенты которого должны все еще быть определены.

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 возвращает эти два решения в массиве структур. Отобразите решения.

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: [1x1 sym]
    X2: [1x1 sym]
    X3: [1x1 sym]
    X4: [1x1 sym]
    X5: [1x1 sym]

Замените решением в L.

L = subs(L, S)
L = 

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

Как ожидалось этот полином является |n|th полиномом Лагерра:

laguerreL(n, t)
ans = 

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

Точки оценки xi корни полиномиального L. Решите L для точек оценки. Корни выражаются с точки зрения функции root.

x = solve(L)
x = 

(корень(σ1,z,1)корень(σ1,z,2)корень(σ1,z,3)корень(σ1,z,4))где  σ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)где  σ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, квадратурное правило должно привести к точным результатам. Достаточно, если это содержит для основания векторного пространства этих полиномов. Это условие приводит к системе четырех уравнений в четырех переменных.

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=1000y1корень(σ1,z,1)+y2корень(σ1,z,2)+y3корень(σ1,z,3)+y4корень(σ1,z,4)=1000y1корень(σ1,z,1)2+y2корень(σ1,z,2)2+y3корень(σ1,z,3)2+y4корень(σ1,z,4)2=2000y1корень(σ1,z,1)3+y2корень(σ1,z,2)3+y3корень(σ1,z,3)3+y4корень(σ1,z,4)3=6000)где  σ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-σ42где  σ1=корень(z4-16z3+72z2-96z+24,z,4)  σ2=корень(z4-16z3+72z2-96z+24,z,3)  σ3=корень(z4-16z3+72z2-96z+24,z,2)  σ4=корень(z4-16z3+72z2-96z+24,z,1)

alpha2 = 

корень(σ1,z,1)корень(σ1,z,3)+корень(σ1,z,1)корень(σ1,z,4)+корень(σ1,z,3)корень(σ1,z,4)-корень(σ1,z,1)корень(σ1,z,3)корень(σ1,z,4)-2корень(σ1,z,1)-2корень(σ1,z,3)-2корень(σ1,z,4)+6корень(σ1,z,2)-корень(σ1,z,1)корень(σ1,z,2)-корень(σ1,z,3)корень(σ1,z,2)-корень(σ1,z,4)где  σ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+σ42где  σ1=корень(z4-16z3+72z2-96z+24,z,4)  σ2=корень(z4-16z3+72z2-96z+24,z,2)  σ3=корень(z4-16z3+72z2-96z+24,z,1)  σ4=корень(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σ4где  σ1=корень(z4-16z3+72z2-96z+24,z,3)  σ2=корень(z4-16z3+72z2-96z+24,z,2)  σ3=корень(z4-16z3+72z2-96z+24,z,1)  σ4=корень(z4-16z3+72z2-96z+24,z,4)

Также можно также получить решение как структуру путем предоставления только одного выходного аргумента.

S = solve(sys, y)
S = struct with fields:
    y1: [1x1 sym]
    y2: [1x1 sym]
    y3: [1x1 sym]
    y4: [1x1 sym]

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+6корень(σ16,z,1)-корень(σ16,z,2)σ1+σ4-σ2-корень(σ16,z,1)2σ1+σ4+σ2-σ7-σ13-σ11-σ10+6корень(σ16,z,2)-корень(σ16,z,1)корень(σ16,z,2)-корень(σ16,z,3)корень(σ16,z,2)-корень(σ16,z,4)σ5+σ4+σ15-σ8-σ13-σ12-σ10+6корень(σ16,z,3)-корень(σ16,z,4)σ5-σ1-σ3+корень(σ16,z,3)2-σ5+σ1+σ3-σ9-σ13-σ12-σ11+6σ14корень(σ16,z,1)+σ14корень(σ16,z,2)+σ14корень(σ16,z,3)-корень(σ16,z,4)3+σ9-σ8-σ7-σ6)где  σ1=корень(σ16,z,1)корень(σ16,z,3)  σ2=корень(σ16,z,3)корень(σ16,z,4)  σ3=корень(σ16,z,2)корень(σ16,z,3)  σ4=корень(σ16,z,1)корень(σ16,z,4)  σ5=корень(σ16,z,1)корень(σ16,z,2)  σ6=корень(σ16,z,2)корень(σ16,z,3)корень(σ16,z,4)  σ7=корень(σ16,z,1)корень(σ16,z,3)корень(σ16,z,4)  σ8=корень(σ16,z,1)корень(σ16,z,2)корень(σ16,z,4)  σ9=корень(σ16,z,1)корень(σ16,z,2)корень(σ16,z,3)  σ10=2корень(σ16,z,4)  σ11=2корень(σ16,z,3)  σ12=2корень(σ16,z,2)  σ13=2корень(σ16,z,1)  σ14=корень(σ16,z,4)2  σ15=корень(σ16,z,2)корень(σ16,z,4)  σ16=z4-16z3+72z2-96z+24

Символьное решение выглядит сложным. Упростите его и преобразуйте его в вектор с плавающей точкой:

alpha = simplify(alpha)
alpha = 

(корень(σ1,z,1)272-29корень(σ1,z,1)144+23корень(σ1,z,2)272-29корень(σ1,z,2)144+23корень(σ1,z,3)272-29корень(σ1,z,3)144+23корень(σ1,z,4)272-29корень(σ1,z,4)144+23)где  σ1=z4-16z3+72z2-96z+24

vpa(alpha)
ans = 

(0.603154104341633601635966023818080.357418692437799686641492017458090.038887908515005384272438168156210.00053929470556132745010379056762059)

Увеличьте удобочитаемость, заменив случаи корней x в alpha сокращениями:

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

(R1272-29R1144+23R2272-29R2144+23R3272-29R3144+23R4272-29R4144+23)

Суммируйте веса, чтобы показать, что их сумма равняется 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 = 

корень(z4-16z3+72z2-96z+24,z,1)272-29корень(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))