Октава: Как я могу подогнать синусоиду к моим данным, используя Октаву? - PullRequest
0 голосов
/ 01 ноября 2018

Моя цель - подогнать синусоиду к данным, полученным от регистратора данных с использованием Octave. Регистратор данных регистрирует силу, которая создается с использованием эксцентра, поэтому теоретически это должна быть синусоида.

Я не смог найти подсказки о том, как это сделать в другом месте.

В настоящее время я использую функцию «splinefit», сопровождаемую «ppval», для подгонки моих данных, но я не получаю ожидаемых результатов ... У кого-нибудь есть идеи, как я могу подогнать синусоиду к своим данным?

Вот мой текущий код, который я использую для подгонки данных, и скриншот результата:

## splinefit force left
spfFL = splinefit(XAxis,forceL,50);    
fitForceL=ppval(spfFL,XAxis);

##middle force left
meanForceL=mean(fitForceL);
middleedForceL=fitForceL-meanForceL;

результат подгонки сплайнов

на оси X у меня 30 000 точек измерения или журналов

На оси Y у меня есть фактические измеренные значения силы

данные поступают из регистратора данных в CSV-файл, подобный этому

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы можете сделать простую регрессию, используя синус и косинус вашего (временного) входа в качестве ваших функций регрессии.

Вот пример

% Let's generate a dataset from a known sinusoid as an example
N       = 1000;
Range   = 100;
w       = 0.25; % known frequency (e.g. from specs or from fourier analysis)
Inputs  = randi(Range, [N, 1]);
Targets = 0.5 * sin( w * Inputs + pi/3 ) + 0.05 * randn( size( Inputs ) );

% Y = A + B sin(wx) + C cos(wx);    <-- this is your model
Features = [ ones(N, 1), sin(w * Inputs), cos(w * Inputs) ];
Coefs    = pinv(Features) * Targets;
A = Coefs(1); % your solutions
B = Coefs(2); 
C = Coefs(3);

% print your nice solution against the input dataset
figure('position', [0, 0, 800, 400])
ax1 = axes()
plot(Inputs, Targets, 'o', 'markersize', 10, ...
                           'markeredgecolor', [0, 0.25, 0.5], ...
                           'markerfacecolor', [0, 0.5, 1], ...
                           'linewidth', 1.5)
set(ax1, 'color', [0.9, 0.9, 0.9])
ax2 = axes()
X = 1:0.1:Range;
plot( X, A + B*sin(w * X) + C*cos(w * X), 'k-', 'linewidth', 5 ); hold on
plot( X, A + B*sin(w * X) + C*cos(w * X), 'g-', 'linewidth', 2 ); hold off
set(ax2, 'xlim', get(ax1, 'xlim'), 'ylim', get(ax1, 'ylim'), 'color', 'none')

enter image description here

0 голосов
/ 01 ноября 2018

Вы можете выполнить оптимизацию по методу наименьших квадратов, используя fminsearch

% sine to fit (in your case your data)
x = 0:0.01:50;
y = 2.6*sin(1.2*x+3.1) + 7.3 + 0.2*rand(size(x)); % create some noisy sine with known parameters

% function with parameters
fun = @(x,p) p(1)*sin(p(2)*x+p(3)) + p(4);  % sine wave with 4 parameters to estimate
fcn = @(p) sum((fun(x,p)-y).^2);            % cost function to minimize the sum of the squares

% initial guess for parameters
p0 = [0 0 0 0];

% parameter optimization
par = fminsearch(fcn, p0);

% see if estimated parameters match measured data
yest = fun(x, par)
plot(x,y,x,yest)

Замените x и y вашими данными. Переменная par содержит параметры синуса, определенные в fun.

...