Официальный сайт студ.городка НГТУ
Программирование и БД » Свертка функций (MATLAB и не только) 

#1  05.04.12 01:43

Свертка функций (MATLAB и не только)

Ребята, разъясните пожалуйста ньюансы свертки функций.
Опишу проблему, есть некая распределенность, пример показан на картинке ниже

http://hostel.nstu.ru/uploaded/gallery/15917_1333560814.jpg


Ее следует аппроксимировать, чтобы найти центры пучков. Аппроксимация проводится по кривой Гаусса, либо Лоренца. Но по строению данных, было решено, что стоит использовать аппроксимацию сверткой Гаусса и Лоренца. И тут то начинаются проблемы) Если проводить свертку через интеграл, то все получается отлично, координаты центров определяются. Но на интегрирование уходит очень много времени. Как известно свертку можно провести, перемножив фурье образы каждой функции и провести обратное преобразование фурье и эта процедура происходит гараздо быстрее. Но тут выплывают сложности, центры совсем не совпадают с теми, которые есть в реале. Да и вообще такая свертка отличается даже визуально от свертки через интеграл, если провести моделирование.
Ниже находится код, который я использовал для моделирования кривых в MATLAB

Код::

clc;
clear all;
x=-30:0.1:30;
G=@(b) b(1)/(b(2)*sqrt(2*pi))*exp(-((x-b(3)).^2)/(2*b(2).^2)); %Gauss
d=[0.5,4,25];
figure(1),plot(x,G(d),'r+'),hold on; 
d1=[0.4,8,25];
L=@(b) b(1)*b(2)./(pi*(x-b(3)).^2+b(2).^2); %Lorenz
figure(1),plot(x,L(d1),'g','LineWidth',2);
d2=[0.5,4,25,0.4,8,0];
SvI=@(b) quadv(@(z) b(1)/(b(2)*sqrt(2*pi))*exp(-((z).^2)/(2*b(2).^2))*b(4)*b(5) ... 
    ./(pi*(x-z-b(3)).^2+b(5).^2),min(x),max(x)); %Svertka integralom
figure(1),plot(x,SvI(d2),'c','LineWidth',2);
SvF=@(b) ifft(fft(G(b(1:3))).*...
    fft(L(b(4:6)))); %Svertka cherez Fur'e
figure(1),plot(x,SvF(d2),'y','LineWidth',2);
Sv=@(b) conv(b(1)/(b(2)*sqrt(2*pi))*exp(-((x-b(3)).^2)/(2*b(2).^2)),b(4)*b(5) ...
    ./(pi*(x).^2+b(5).^2),'same'); %Svertka cherez MATLAB
figure(1),plot(x,Sv(d2),'b','LineWidth',2);
legend('Gauss','Lorenz','SverInt','SverFur','Sver');

Вот результат

http://hostel.nstu.ru/uploaded/gallery/15917_1333562704.jpg


Тут видно график Гаусса, график Лоренца и кривые сверток проведенные различными способами. И вот объясните пожалуйста, почему свертки так отличаются? И как всетаки мне, когда я буду проводить аппроксимацию, узнать центр получившейся кривой свертки, ведь подставляя реальные центры, кривая свертки смещается в какие-то другие координаты?
Еще в данном коде применена свертка, которая уже предусмотрена в матлабе, но когда я подставляю свои реальные велечины, которые гораздо больше параметров этих кривых, свертка получается вообще странная, фото ниже:

http://hostel.nstu.ru/uploaded/gallery/15917_1333564369.jpg


Здесь по порядку, эксперементальные данные, гаусс и лорнец, которым я данные вручную задал, чтобы чем-то похоже было на мои данные, и последняя кривая та самая свертка матлаба, и как видно получилось что-то совсем не понятное.
ну и если вдруг надо, ниже код, но для него нужен файл:

Код::

clc;
clear all;
Y=dlmread('88.3.txt');
y=Y(1:size(Y,1)/2,2);
x1=1:size(y,1);

figure(2),plot(x1,y,'r+','LineWidth',2),hold on;
G=@(b) b(1)/(b(2)*sqrt(2*pi))*exp(-((x1-b(3)).^2)/(2*b(2).^2));
d=[1500,60,160];
figure(2),plot(x1,G(d),'c'),hold on;
d1=[700,60,160];
L=@(b) b(1)*b(2)./(pi*(x1-b(3)).^2+b(2).^2);
figure(2),plot(x1,L(d1),'g','LineWidth',2);
d3=[1500,60,160,700,60,160];
Sv=@(b) conv(b(1)/(b(2)*sqrt(2*pi))*exp(-((x1-b(3)).^2)/(2*b(2).^2)),...
    b(4)*b(5)./(pi*(x1).^2+b(5).^2),'same');
figure(2),plot(x1,Sv(d3),'y','LineWidth',2);
legend('Data','Gauss','Lorenz','Sver');

Помогите пожалуйста, буду рад любым высказанным умозаключениям))

Offline

#2  05.04.12 21:45

Re: Свертка функций (MATLAB и не только)

Ну что, нет в наших краях математика, который сможет мне все раскидать по полочкам че да как?)

Offline

Программирование и БД » Свертка функций (MATLAB и не только) 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.201 сек.
Выполнено 14 запросов.