Рішення навчальних завдань в Maple.
Коефіцієнти ряду Фур'є.
Отримання формул для коефіцієнта ряду Фур'є в Maplе 6 (tm)
У навчальних завданнях на ряди Фур'є буває потрібно отримати формулу загального члена ряду. Зокрема, це може бути потрібно для з'ясування асимптотики амплітуд вищих гармонік.
Відомі за книжками Maple програми дають лише приватні суми (поліноми Фур'є) з заданим числом членів, але не дають формул для членів з довільним номером. Ця програма олічается саме тим, що дає загальний вигляд коефіцієнтів, а не просто величини деякої кількості перших з них.
Тобто програма дає у вигляді явних формул коефіцієнти An = a (n) і Bn = b (n) в розкладанні f (x) = A0 + sum (An * Cos (n * (2 * Pi * (x-x1) / (x2 -x1) -Pi)) + Bn * Sin (n * (2 * Pi * (x-x1) / (x2-x1) -Pi), де x = 1..infinity).
УВАГА. Обчислення інтегралів з параметрами в Maple має особливість: Maple не так досконалий, щоб за власною ініціативою досліджувати область зміни значень параметрів. Тому пропонована програма має невеликий дефект: якщо розкладається в ряд Фур'є функція f містить кілька синусоїдальних складових, що мають періодом довжину заданого Вами проміжку (тобто кілька доданків в f (x) мають той же вигляд, що і члени шуканого ряду Фур'є), то відповідні їм формули коефіцієнтів a (n) і b (n) "не помітять" цих доданків (тобто створені Mapl'ом формули в цьому випадку будуть невірні для деяких значень n). Наприклад, розкладання функції f = x і функції f = x + sin (x) на проміжку [-Pi, Pi] в ряд Фур'є по системі x), sin (n * x)> олічается один від одного тільки одним коефіцієнтом - при слагаемом sin (x). Формула b (n), що генерується цією програмою, буде вірна при всіх n> 1, але невірна при n = 1.
Конкретна причина цього полягає в тому, що Maple добре бере інтеграл виду
при числових значеннях k і n. Але в загальному випадку Maple 6 не знає, що ситуацію k = n треба розглядати окремо. Maple 6 не знає, що написаний вище інтеграл рівний не нулю, а "дельті" Кронекера (з точністю до множника, зрозуміло). Зокрема, для функції sin (x) + sin (2 * x) на проміжку [-Pi, Pi] ця програма дасть a (n) = 0 і b (n) = 0 саме з цієї причини.
Скласти програму, яка б автоматично розпізнавала в складі функції f (x) синусоїдальні складові з періодом L, важко і навряд чи потрібно.
По-перше, маючи на увазі дослідження поведінки a (n) і b (n) при n -> infinity, можна бути впевненим, що кінцеве число членів на початку послідовності на асимптотику не впливає. А функції, що містять багато таких доданків, не часто трапляються.
По-друге ми ж і самі знаємо, задавали ми таке доданок у формулі для f (x), чи не так?
По-третє в кінці програми додана перевірка отриманих формул a (n) і b (n) до номера, при якому приватна сума Sn (x) шуканого ряду відрізняється від f (x) менше, ніж на epsilon * || f (x) || (Але не більше, ніж до номера Nmax, який можна змінювати). Зрозуміло, якщо Ви задасте f (x) = x + 0.00001 * Sin (1000 * x) і epsilon = 0.1, то перевірка не добереться до n = 1000 при будь-яких Nmax. Але ж Ви і без перевірки бачите це доданок і розумієте, що Maple дає Вам коефіцієнти Вашої функції БЕЗ НЬОГО.
Задаємо функцію f (x), межі проміжку [x1, x2] і відносну похибку epsilon для підбору числа доданків в приватній сумі Sn (x) ряду Фур'є.
Завдання f (x) саме як функції, а не як вираження, пояснюється тим, що в молодших версіях Maple виникали проблеми в формулах, що містять одночасно і функції і вирази. Maple 6, здається, звільнився від цих проблем, але. - см. Додаток 2.
Тепер побудуємо графіки заданої функції і приватної суми ряду Фур'є з N складовими.
Якщо хочеться побачити формулу приватної суми - ставте крапку з комою замість двокрапки.
2. Тепер виконаємо те ж саме у вигляді числовому (коефіцієнти - в точній числовому, оцінки - в наближеному числовому). Кількість доданків n в приватній сумі Sn постараємося взяти таким, щоб Sn відрізнялася від f (x) не більше ніж на eps * || f (x) || в квадратичної нормі (через вимоги обмеженості числа доданків n > Eps3: = evalf ((epsilon ^ 2-1) * normaf2): delta: = evalf (Int (Sn * (Sn-2 * f (x)), x = x1..x2)): Закриваючою дужкою оператора циклу "do" є "end do"; а в версіях Maple до 6-ї - "od". > K: = 'k': n: = 'n': flag: = 0: for k from 1 while delta> eps3 and k<=Nmax do: n: =k; An: =int(f(x)*cos(n*(koef*x-x0)),x=x1..x2)*2/L: Bn: =int(f(x)*sin(n*(koef*x-x0)),x=x1..x2)*2/L: Sn: =Sn+An*cos(k*(koef*x-x0))+Bn*sin(n*(koef*x-x0)): delta: =evalf(Int(Sn*(Sn-2*f(x)),x=x1..x2)): if (An<> a (n)) then print ( `Формула a (n) невірна при n` = n): flag: = 1: end if: if (Bn<> b (n)) then print ( `Формула b (n) невірна при n` = n): flag: = 1: end if: end do: > Print ( `перевірені формули коефіцієнтів аж до номера n` = n); > If flag = 0 then print ( `графік заданої функції і приватної суми до n` = n) else print (` графік заданої функції та способи їх усунення приватної суми до n` = n) end if; > D: = sqrt (evalf (Int ((Sn-f (x)) ^ 2, x = x1..x2)) / normaf2): print ( `Різниця між Sn (x) і f (x) характеризується числом | | Sn-f (x) || / || f (x) || `= d); print ( `при заданому eps` = epsilon);Схожі статті