【问题标题】:Octave: How can I fit a sinusoid to my data using Octave?Octave:如何使用 Octave 将正弦曲线拟合到我的数据中?
【发布时间】:2019-04-05 03:38:30
【问题描述】:

我的目标是使用 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 文件,如下所示

【问题讨论】:

  • 听起来像是 xy 问题。你真正想做的是什么?您是否可能只想获得采样值的频率(也许还有幅度和相位)?请参阅 FFT 了解这一点,也许还有过零的周期测量。请逐字添加您的数据,切勿添加代码或数据作为屏幕截图。

标签: matlab octave data-fitting trigonometry


【解决方案1】:

您可以使用(时间)输入的正弦和余弦作为回归特征进行简单回归。

这是一个例子

% 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')

【讨论】:

  • 附言。请注意,您始终可以使用标准三角恒等式从 Bsin(x) + Ccos(x) 系数返回到单个正弦 (pages.pacificcoast.net/~cazelais/252/lc-trig.pdf)
  • 感谢您的回答!这可能是一个愚蠢的问题,但我对这个主题还很陌生......我在你的解决方案中究竟将我的输入 X 和 Y 放在哪里?
  • @S.Hug 将Inputs 替换为您的输入(即X,时间点),并将Targets 替换为您正在尝试的目标(即Y,您的信号)适合模型。和N 观察次数。
  • 假设脉动为1,如wt=t。任何方式都可以通过您的方法确定脉动/周期?
  • @Hoki 感谢您指出这一点,我是想提一下,但忘了!从问题的性质来看,频率似乎是已知的;但如果不是,我个人会简单地首先从原始信号的傅立叶分析中获得它并直接插入,而不是对其进行单独的优化。
【解决方案2】:

您可以使用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)

xy 替换为您的数据。 par 变量包含正弦参数,如fun 中所定义。

【讨论】:

  • 您好,感谢您的即时回答!我试图实现它,但窦的振幅太小,频率太高。我该如何解决这个问题?
  • 您可以将初始猜测 p0 更改为更接近您期望的频率和幅度的一些值。在这种情况下,由于您已经有了平均值和峰峰值幅度,您可以从参数估计中省略这些或相应地设置初始猜测值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2019-09-04
  • 2012-10-28
  • 2018-11-19
  • 2020-12-11
相关资源
最近更新 更多