Модель для компьютерного эксперимента: две молекулы (всего 5 атомов) расположены на расстоянии ~5 Å на отрезке [0, 30]. Электронные плотности атомов описываются гауссовой кривой. Функция электронной плотности атомов на этом отрезке была задана с помощью скрипта compile-func.py:
python compile-func.py -g 2,3.5,3.1+32,3,4.2+8,3,5.3+24,3,10.1+34,3,11.5
Выходной файл скрипта compile-func.py - текстовый файл func.txt, в котором описана заданная функция (в виде пар X – Y). Скрипт также позволяет получить изображение заданной совокупности гауссовых функций:
Коэффициенты разложения функции в ряд Фурье были получены с помощью скрипта func2fourier.py:
python func2fourier.py -i func.txt
Выходной файл скрипта func2fourier.py – текстовый файл func_ft.txt. В нём приведены амплитуды и фазы гармоник, а также их номера.
Из 499 гармоник были отбирались гармоники, с тем чтобы найти n0, для которого по графику восстановленной по полному набору гармоник (0, 1, ..., n0) функции можно было определить положение максимумов всех гауссовых слагаемых («отличное восстановление»):
python fourier-filter.py -r 0-20 -i func_ft.txt -o func_ft_0-20.txt python fourier2func.py -f func.txt -i func_ft_0-20.txt -o two_func_0-20.txt python fourier-filter.py -r 0-30 -i func_ft.txt -o func_ft_0-30.txt python fourier2func.py -f func.txt -i func_ft_0-30.txt -o two_func_0-30.txt python fourier-filter.py -r 0-35 -i func_ft.txt -o func_ft_0-35.txt python fourier2func.py -f func.txt -i func_ft_0-35.txt -o two_func_0-35.txt # Флаг -s для fourier2func.py позволяет скрыть исходную функцию
Значение n0 было определено равным 35. Ниже приведены графики восстановленных функций по полным наборам гармоник для n, равных 20, 30 и n0 = 35 (результат документирован в таблице 1):
↑ Восстановление для n = 20 можно оценить как «среднее»: положение лишь некоторых атомов можно определить по восстановленной функции. Для n = 30 по восстановленной функции можно угадать положение всех максимумов, зная число слагаемых, однако на восстановленной функции максимумы некоторых «атомов» плохо отличимы от шума («хорошее восстановление»). По графику функции, восстановленной по полному набору гармоник 0, 1, ..., 35 можно определить положение максимума всех гауссовых слагаемых функции («отличное восстановление»).
Использование бо́льших значений n для полных наборов гармоник позволяет ещё более точно восстановить исходную функцию:
Затем к амплитудам и фазам был добавлен шум (20% к амплитуде; 20% к фазе; по 10% к амплитуде и фазе):
# Добавление шума только к амплитуде python func2fourier.py -F 20 -i func.txt -o ft_noise20-0.txt python fourier-filter.py -r 0-35 -i ft_noise20-0.txt -o ft_noise20-0_n0.txt python fourier2func.py -i ft_noise20-0_n0.txt -o two_func_noise20-0_n0.txt # Добавление шума только к фазе python func2fourier.py -P 20 -i func.txt -o ft_noise0-20.txt python fourier-filter.py -r 0-35 -i ft_noise0-20.txt -o ft_noise0-20_n0.txt python fourier2func.py -i ft_noise0-20_n0.txt -o two_func_noise0-20_n0.txt # Добавление шума к амплитуде и к фазе python func2fourier.py -F 10 -P 10 -i func.txt -o ft_noise10-10.txt python fourier-filter.py -r 0-35 -i ft_noise10-10.txt -o ft_noise10-10_n0.txt python fourier2func.py -i ft_noise10-10_n0.txt -o two_func_noise10-10_n0.txt
Восстановление функции производилось по полному набору гармоник 0, 1, ..., n0. Качество восстановления заметно снизилось (можно охарактеризовать его как «среднее»), что отражено на изображениях ниже (а также зафиксировано в таблице 1):
↑ Как видно, при выбранных значениях шума (как для амплитуды, так и для фазы) становится невозможным восстановление всех положений максимумов гауссовых функций. Для более низких значений шума (по 5% к амплитуде и фазе) положения максимумов угадываются («хорошее восстановление»):
Для получения неполного набора гармоник были удалены одна и две начальные гармоники (гармоника с номером 0; гармоники с номерами 0 и 1):
# Удаление первой гармоники python fourier-filter.py -r 1-35 -i func_ft.txt -o ft_1-35.txt python fourier2func.py -i ft_1-35.txt -o two_func_1-35.txt # Удаление первых двух гармоник python fourier-filter.py -r 2-35 -i func_ft.txt -o ft_2-35.txt python fourier2func.py -i ft_2-35.txt -o two_func_2-35.txt
В случае удаления первой гармоники при последующем восстановлении функции видно, что она смещена по оси ординат; при этом результат восстановления можно считать «отличным». Это ожидаемый результат, так как значение первой гармоники равно числу F0 – первому коэффициенту ряда Фурье.
В результате удаления первых двух гармоник восстановленная функция заметно искажается, однако значения максимумов можно однозначно определить.
Для получения неполного набора гармоник без ~10% гармоник в его середине были удалены гармоники с номерами 16 - 18, гармоники с номерами 15 - 19):
# Удаление 8% гармоник в середине набора python fourier-filter.py -r 0-15,19-35 -i func_ft.txt \ -o ft_0-15_19-35.txt python fourier2func.py -i ft_0-15_19-35.txt \ -o two_func_0-15_19-35.txt # Удаление 14% гармоник в середине набора python fourier-filter.py -r 0-11,15-17,20-35 -i func_ft.txt \ -o ft_0-11_15-17_20-35.txt python fourier2func.py -i ft_0-11_15-17_20-35.txt \ -o two_func_0-11_15-17_20-35.txt
Удаление как 14%, так и 8% гармоник в середине набора привело к заметному ухудшению качества восстановления (его можно охарактеризовать как «среднее»). Таким образом, вследствие удаления гармоник в середине набора максимумы от «атомов» становятся менее отличимы от шума:
К набору гармоник 0, 1, ..., 35 была добавлена гармоника 45:
python fourier-filter.py -r 0-35,45 -i func_ft.txt -o ft_0-35_45.txt python fourier2func.py -i ft_0-35_45.txt -o two_func_0-35_45.txt
Добавление гармоники с номером n0+10 к набору гармоник 0, 1, ..., n0, насколько можно судить по изображению восстановленной функции, не изменила качество восстановления. При сравнении с функцией, восстановленной по набору гармоник 0, 1, ..., n0, удаётся обнаружить лишь незначительные изменения:
Для полного набора гармоник разрешение определяется как период гармоники с наибольшим номером. Тогда, например, разрешение для полного набора гармоник 0, 1, ..., 35 равно 30 Å / 35 ≈ 0,86 Å (в данном компьютерном эксперименте). Полнота данных вычисляется как процент гармоник в наборе, период которых не меньше разрешения, от числа гармоник в полном наборе для этого разрешения. Для полного набора полнота данных равна 100%.
Для неполного набора гармоник разумно всегда указывать, помимо разрешения, полноту данных. Так, для набора гармоник 0, 1, ..., 35, 45 разрешение можно определить равным ~0,66 Å при полноте данных 80%. Однако более «справедливым» выглядит разрешение ~0,86 Å при полноте данных 100%. Таким образом, при указании разрешения для неполного набора гармоник видится разумным использование некоего условного порога на полноту данных (например, в 90%).
Набор гармоник | Разрешение, Å | Полнота данных, % | Шум амплитуды (% от F) | Шум фазы (% от phi) | Качество восстановления |
Полный набор гармоник | |||||
0-20 | 1,5 | 100 | 0 | 0 | Среднее |
0-30 | 1 | 100 | 0 | 0 | Хорошее |
0-35 | 0,86 | 100 | 0 | 0 | Отличное |
0-35 | 0,86 | 100 | 20 | 0 | Среднее |
0-35 | 0,86 | 100 | 0 | 20 | Среднее |
0-35 | 0,86 | 100 | 10 | 10 | Среднее |
0-35 | 0,86 | 100 | 5 | 5 | Хорошее |
Неполный набор гармоник | |||||
1-35 | 0,86 | 97,2 | 0 | 0 | Отличное |
2-35 | 0,86 | 94,4 | 0 | 0 | Отличное |
0-15, 19-35 | 0,86 | 91,7 | 0 | 0 | Среднее |
0-11, 15-17, 20-35 | 0,86 | 86,1 | 0 | 0 | Среднее |
0-35, 45 | 0,86 | 100 | 0 | 0 | Отличное |