Ряд Фурье как инструмент
Первые два курса на МатМехе изучают, в основном математические предметы типа математического анализа. Кто что понял и запомнил не всегда важно. Зато потом можно смело произносить магическую фразу «по теореме из математического анализа» вытаскивая откуда-то формулу или неочевидное утверждение. Все формы для производных и интегралов берутся оттуда и просто используются как аксиомы не требующие доказательств. Если кому-то очень надо будет он найдёт учебник и разберётся почему это именно так.
Математика выполняет роль своеобразного станкостроения. Сама она не даёт конечных результатов, но создаёт инструментарий с помощью которого уже можно делать что-то пригодное для использования.
Один из таких инструментов – ряд Фурье, в который можно разложить любую функцию. Но про него ниже.
Ряд это сумма, в идеале бесконечная и обозначаемая как-то так:
Интеграл и сумма бесконечного ряда – близкие родственники. Отсюда и обозначение интеграла в виде вытянутой буквы S.
Приближённое значение интеграла – площади можно получить умножив значения функция в точках на ширину «ступеньки»:
Цифрами это записывается так:
Т.е можно просто просуммировать ступеньки, выбрав какую-то ширину. Получится значение с какой-то небольшой точностью. Это первая строка.
Можно придумать более компактную запись для этой суммы ступенек, увидев, кто аргумент функции f это номер слагаемого, умноженный на ширину «ступеньки». Это вторая строка.
Можно, наконец, записать это через знак суммы. Это третья строка.
Но ведь чтобы получить точное значение площади под графиком надо чтобы ширина ступеньки была как можно меньше. Эта ширина должна быть бесконечно малой. Но тогда и слагаемых должно быть бесконечно много. Так и получается сумма бесконечного ряда по величине форме и содержанию равная интегралу.
Выше показано как с помощью рада получить площадь под любым графиком. Но и саму функцию можно разложить в рад. Чем больше в нем будет слагаемых тем точнее сумма приблизит исходную функцию. Но для практических целей может хватить и десятка слагаемых.
Формулы разложения любой функции в ряд Фурье (где-то как-то доказываемые но обычно используемые просто так):
http://www.math24.ru
Раз дали формулу значит надо попробовать по ней что-то посчитать. Например, можно попытаться приблизить этими синусами и косинусами параболу. Будет так:
А на картинке так:
Вполне себе парабола, как настоящая. Разве что точность по краям сильно меньше чем хотелось бы. Но ведь и взято всего 10 слагаемых ряда. А вот так будет если взять 100:
Явно стало лучше.
В некоторых случаях может потребоваться слегка изменить формулу, подогнав её к конкретной задаче, если в конкретном случае общая не работает. Тогда надо залезть в данный кем-то инструмент и что-то в нем подправить чтобы он начал подходить к этой задаче. Для этого сам инструмент тоже изучается на младших курсах, хотя основная его часть к старшим курсам забывается.
Чтобы получить график у меня было записано так:
f:=x*x/2;
x1:=0;
x2:=3;
L:=(x2-x1)/2;
a[n]:=int(f*cos(n*Pi*x/L),x=x1..x2)/L;
b[n]:=int(f*sin(n*Pi*x/L),x=x1..x2)/L;
s:=a0/2+sum(a[n]*cos(n*Pi*x/l)+b[n]*sin(n*Pi*x/L), n=1..100):
plot({s,f}, x=x1..x2, color=[blue,black],thickness=2, linestyle=[3,1]);
Если мне что-то надо поменять а изменю тексты и опять нарисую график. Сами по себе ряды Фурье это инструмент. И можно оформить их вычисление в отдельном программном инструменте, к которому можно обращаться подставляя различные функций для их приближенного вычисления:
Напишу так:
fourierseries:=proc(f,x,x1,x2,n) local k, l,a, b, s;
l:=(x2-x1)/2;
a[0]:=int(f,x=x1..x2)/l;
a[k]:=int(f*cos(k*Pi*x/l),x=x1..x2)/l;
b[k]:=int(f*sin(k*Pi*x/l),x=x1..x2)/l;
s:=a[0]/2+sum(a[k]*cos(k*Pi*x/l)+b[k]*sin(k*Pi*x/l), k=1..n);
end;
И получу созданный программный инструмент – функцию, которой можно передавать различные функции и диапазоны:
Дальше достаточно написать так:
… чтобы получить приближение, например, прямой на интервале от 0 до 5:
f:=x/2:x1:=0:x2:=5:
fr:=fourierseries(f,x,x1,x2,10):
plot({fr,f}, x=x1..x2, color=[blue,black],thickness=2, linestyle=[3,1]);
Но пусть я хочу что-то экзотическое с математической точки зрения и сплошь и рядом встречающееся на практике.
Я, например, хочу приблизить рядом Фурье вот такую функцию:
Этот «струна» которую изначально растянули в некой точке x_h (не обязательно в середине) на расстояние h. А все стандартные математические функции гладкие. С точки зрения такой математики это две линии, соединённые вместе а не одна какая-то функция.
Но если получать значение в виде суммы слагаемых ряда Фурье то досадную проблему угла (не дающие работать с функцией как с обычной) можно спрятать в гладких синусах и косинусах.
При этом надо немного подправить функцию разложения в ряд Фурье, в которую теперь будет передаваться не любая гладкая функция, а то, на каком расстоянии и на какую величину оттянули струну.
Maple, правда, с такой штукой работает, но в основном потому что он уже не обычная математика. Но созданию более удобной функции для конкретного случая это никак не мешает:
f_struna:=proc(h,x_h,x,x1,x2,n) local k,r,k1,k2,v2,f_vverh,f_vniz,f,l,a, b, s;
l:=(x2-x1)/2;
k1:=h/x_h;
k2:=h/(x_h-x2);v2:=-k2*x2;
f_vverh:=k1*x;
f_vniz:=k2*x+v2;
f:=piecewise(x<x_h, f_vverh, x>=x_h, f_vniz);
a[0]:=int(f,x=x1..x2)/l;
a[k]:=int(f*cos(k*Pi*x/l),x=x1..x2)/l;
b[k]:=int(f*sin(k*Pi*x/l),x=x1..x2)/l;
s:=a[0]/2+sum(a[k]*cos(k*Pi*x/l)+b[k]*sin(k*Pi*x/l), k=1..n);
end;
Вызов:
x1:=0;x2:=5:h:=1:x_h=1:
fr:=f_struna(h,x_h,x,x1,x2,3):
И, наконец, внешний вид:
… который уже на трёх слагаемых даёт такую хорошую точность.
В некоторых случаях и в математические выкладки приходится так залезать доказывая какие-то леммы и теоремы. Хотя это нужно довольно редко.
|