Search This Blog

Tuesday, November 5, 2013

Применение метода Аппроксимации в оптимизации конструкций

          В этом параграфе мы рассмотрим, как алгоритм вычисления аппроксимаций Паде реализован в таких популярных математических пакетах, как Maple, Mathematica и Matlab.
В Maple встроенная процедура pade(f, x = a, [n, m]) позволяет найти аппроксимацию Паде типа (n, m) в точке x = a функции f(x). Если при обращении к процедуре pade запросить доступную для пользователя информацию, указав, например, значение параметра infolevel[pade]:= 1, то будет получено сообщение об используемом для вычисления аппроксимации алгоритме. В случае, когда коэффициенты ряда Тейлора функции f(x) не содержат параметров и чисел с плавающей точкой, используется быстрый алгоритм Кабая и Чоя[2]. В остальных случаях нахождение аппроксимации проводится по алгоритму Геддеса [3],использующему символьные вычисления.
В случае неодномерного ядра матрицы (1) вектор, составленный из коэффициентов знаменателя, может быть найден не надлежащим образом, что может привести к появлению лишних нулей знаменателя и числителя. Покажем это на примерах.
Пример 1
Найдем аппроксимацию Паде π2,3(f1) типа (2, 3) функции f1(x) = x+1,0001 (x+1,999)(x−2,001) в точке x = 0. В этом случае ядро матрицы (1) неодномерно, однако, как видно из примера, найденные знаменатель и числитель не содержат лишних нулей.
restart;
with(numapprox);
padef1:= pade
x+1,0001
(x+1,999)(x−2,001), x = 0, [2, 3];
−0,2500250626−0,2500000625x1,000000000+0,0005000002006x−0,2500000625x2
factor(denom(padef1), complex); solve(numer(padef1) = 0);
0,2500000625(x + 1,999000000)(x − 2,001000000)−1,000100000.
 Пример 2
Найдем аппроксимацию Паде π4,5(f2) типа (4, 5) функции f2(x) = (x−3,001)(x+1,9999) (x2+1)(x+4,0001) вточке x = 0. В этом случае ядро матрицы (1) неодномерно, и найденные знаменатель и числитель аппроксимации Паде имеют лишние нули (они выделены жирным шрифтом).
padef2:= pade
(x−3,001)(x+1,9999)
(x2+1)(x+4,0001) , x = 0, [4, 5];
−1,500387465−0,3753104091x−0,4121913908x
2−0,08614086896x3+0,1068576988x41,000000000+0,3333333332x+1,448275862x2+0,4401910336x3+0,4482758628x4+0,1068577004x5
factor(denom(padef2), complex); factor(numer(padef2), complex);
0,1068577004(x + 4,000100004)(x + 0, 09748654036 + 1, 526433054I) (x + 0, 09748654036 − 1, 526433054I)(x + 1,000000001I)(x − 1,000000001I) 0,1068576988(x + 1,999900006)(x + 0, 09748653975 + 1, 526433060I) (x + 0, 09748653975 − 1, 526433060I)(x − 3,001000018).
Отметим, что в обоих приведенных примерах мы находимся в так называемом сингулярном блоке таблицы Паде для аппроксимируемой рациональной функции и, согласно теории аппроксимаций Паде, π2,3(f1), π4,5(f2) должны были оказаться равными рациональным дробям f1(x) и f2(x).
Найденная с помощью Maple аппроксимация π2,3(f1) оказалась равной аппроксимируемой функции, и в этом случае не появилось лишних нулей числителя и знаменателя. Однако аппроксимация π4,5(f2) не совпала с f2(x), у числителя и знаменателя аппроксимации появились близкие нули – дуплеты Фруассара. Дело в том, что из неодномерного ядра матрицы Tn+1 (1) в первом случае (случайно) был выбран правильный знаменатель. Во втором же примере взятый знаменатель не совпал со знаменателем рациональной дроби f2(x).
Похожая картина наблюдается и при попытке найти π2,3(f1), π4,5(f2) с помощью системы Mathematica. Как показывают приведенные ниже примеры, при этом опять появляются дуплеты Фруассара.
Пример 3
Вновь, как в примере 1, найдем аппроксимацию Паде π2,3(f1) типа (2, 3) функции f1(x) = x+1,0001(x+1,999)(x−2,001) в точке x = 0. Появляющиеся при этом дуплеты Фруассара выделены жирным шрифтом.
In[1]:= PadeApproximant[
x+1,0001
(x+1,999)(x−2,001), {x, 0, {2, 3}}]
Out[1]= −0,250025−0,222305x+0,0276927x 2
1,000000000000000−0,110271x−0,250055x2+0,0276927x3
In[2]:= Roots[Denominator[Out[1]] == 0, x]
Out[2]= x == −1, 999||x == 2, 001||x == 9, 02765
In[3]:= Roots[Numerator[Out[1]] == 0, x]
Out[3]= x == −1, 0001||x == 9, 02765
Пример 4
Как в примере 2, найдем аппроксимацию Паде π4,5(f2) типа (4, 5) функции f2(x) =(x−3,001)(x+1,9999)(x2+1)(x+4,0001) в точке x = 0.
In[4]:= PadeApproximant[
(x−3,001)(x+1,9999)((x2+1)(x+4,0001) , {x, 0, {4, 5}}]
Out[4]= −1,50039−25,4213x−6,51318x
2+3,7662x
3+0,42731x4
1,00000000000000+17,0263x+6,90326x2+17,4536x3+5,90326x4+0,42731x5
In[5]:= Roots[Denominator[Out[4]] == 0, x]
Out[5]:= x == −9, 75487||x == −4, 0001||x == −0, 0599743||x == −1, 0I||x == +1, 0I
In[6]:= Roots[Numerator[Out[4]] == 0, x]
Out[6]= x == −9, 75487||x == −1, 9999||x == −0, 0599743||x == 3, 001
Итак, числитель и знаменатель найденной по алгоритму, реализованному в Maple и Mathematica аппроксимации Паде, могут оказаться не взаимно простыми. 

No comments:

Post a Comment