正弦函数曲线拟合
1.339视图(30天)
显示旧的评论
接受的答案
明星黾
2014年3月15日
编辑:明星黾
2014年3月15日
这是我的建议的解决方案,仅使用核心MATLAB函数:
yu = max (y);
yl = min (y);
年= (yu-yl);%的“y”
yz = y-yu +(年/ 2);
zx = x (yz。* circshift (yz, [0 1]) < = 0);%找到零交点
每= 2 *意味着(diff (zx));%的估计时间
ym =意味着(y);%估计抵消
适合= @ (b, x) b(1) *(罪(2 *π* x / b(2) + 2 *π/ b (3))) + b (4);%的功能以适应
fcn = @ (b)和((适合(b, x) - y)。^ 2);%最小二乘成本函数
s = fminsearch (fcn[年;每;1;ym])%减少最小二乘
xp = linspace(最小(x)最大(x));
图(1)
情节(x, y,“b”,xp,适合(年代,xp),“r”)
网格
输出参数向量的元素,
年代
(
b
在函数):
(1)
:正弦波振幅(在单位的
y
)
(2)
(单位:时期
x
)
(3)
:阶段(阶段
(2)/ (2 * (3))
在单位的
x
)
(4)
:抵消(在单位
y
)
它提供了一个合适的选择。
41岁的评论
帕特里克Fairclough
2015年6月27日
编辑:帕特里克Fairclough
2015年6月27日
一个非常优雅的解决方案,我喜欢,你是怎样使原始信号余量不穿越零然后把它找到零。将这个计数数据2 0 2两个零交叉?(< = 0)
明星黾
2015年6月27日
谢谢你,Fairclough教授。我很欣赏你的赞美。
使用这种结构:
t =十12;
x = (2 0 2) ';
zx = t (x。* circshift (x, [0 1]) < = 0)
它返回:
zx =
11
因为:
L = (x。* circshift (x, [0 1]) < = 0)
返回:
L =
0
1
0
所以它只返回一个零交点。
在这个实例中(和其他人,我使用它),它提供了一个初步估计的零交叉的回归(像这样的),或定义一个范围的值的线性插值。在这种背景下,近距离是足够好,因为它是一个初始的估计更准确的值。
使用这种方法定义一个“零交点”是根据定义不准确,因为它“选择”(原谅神人同形同性论)的指数或另一侧实际零交点
如果
函数是不完全是零。(这取决于
circshift
电话使用
+ 1
或
1
)。这是等于零,逻辑正确检测到它。
明星黾
2016年8月11日
我的荣幸!
的
' 1 '
阶段词汇的一部分,选择初始参数估计函数收敛。(非线性参数估计的例程可以极其敏感的初始参数估计,所以尝试去看看工作是必要的。在这里,
' 1 '
初始阶段时期效果最好。)我的代码是为了得到初始参数估计的数据,让它尽可能的与数据的数据。在某些情况下,它将需要调整出最适合。
约翰内斯肌肉
2016年11月3日
伟大的解决方案!我在用例中,包括一个阶段估计对我工作得很好:
阶段=国防部(每)/ / zx (1),
@Star黾:如果你没有版权的反对,我想发表我的适应函数文件交换(提及这个线程)和在这里放一个链接。
明星黾
2019年6月17日
@Edward拦截器- - - - - -
可能:
适合= @ (b, x) b(1) *(罪(2 *π* x / b(2) + 2 *π/ b (3)))。^ 2 + b (4);%的功能以适应
注意:
未测试的
关于
。
M.A.G.
2020年2月29日
此外,阅读
circshift文档:
的默认行为
circshift (K)
在哪里
K
是一个标量R2016b改变。保留R2016a的行为和以前的版本中,使用
circshift (K, 1)
。这个语法指定1维操作。
这应该allter输出在这种情况下吗?
明星黾
2020年2月29日
有趣的你了。
我最近更新的,在另一个答案,添加一个引用
“zci”
函数,很多年前我写的:
x = linspace(0、5 *π);
y = 100 * sin (x) + 700;
yu = max (y);
yl = min (y);
年= (yu-yl);%的“y”
yz = y-yu +(年/ 2);
zci = @ (v)找到(v (:)。* circshift (v (:), 1, 1) < = 0);%返回的参数向量的近似零交点指数(> = R2016b)
zx = x (zci (yz));%找到零交点
每= 2 *意味着(diff (zx));%的估计时间
ym =意味着(y);%估计抵消
适合= @ (b, x) b(1) *(罪(2 *π* x。* b(2) + 2 *π* b (3))) + b (4);%的功能以适应
fcn = @ (b)和((适合(b, x) - y)。^ 2);%最小二乘成本函数
s = fminsearch (fcn[年;1 / /;1;ym])%减少最小二乘
xp = linspace(最小(x)最大(x));
图(1)
情节(x, y,“b”,xp,适合(年代,xp),“r”)
网格
这也改变了时间表示频率。两个版本。
明星黾
2021年8月3日
谢谢你!
一个更新我最初发布以来这7½年前:
zxi =找到(diff(签署(yz)));
zx = x (zxi);
或者,使用匿名函数实现:
zci = @ (v)找到(diff(签署(v)));
zx = x (zci (yz));
这是更健壮,没有“影响终结”问题时'假'零交点的向量由于“全方位”的效果
circshift
介绍了。
。
zizo宏
2021年10月24日
适合使用的功能,我想知道你从哪里得到的2 *π/ b (3) ?我期望的一般形式罪一波类似
b(1) *(罪(2 *π* x / b (2) + b (3))) + b (4);
以b(3)相移
明星黾
2022年1月16日
玛雅Eyal -
我很感谢你的赞美!
超越函数的参数总是无单位(无量纲),例如角频率乘以时间呈现无单位,和阶段同样是没有单位的。角频率的基本单位(弧度/秒,循环/两周,等等)和相位单位(弧度,周期)必须始终是相同的,并不能改变整个系统的计算。
。
明星黾
2022年4月25日
Negin Rahmati -
的
“y”
抵消最初估计:
ym =意味着(y);%估计抵消
和使用代码来估计的相关参数,包括零交点的计算。它也成为初始参数估计补偿参数
“b (4)”
。
阿什法克·艾哈迈德
2023年3月7日
编辑:阿什法克·艾哈迈德
2023年3月7日
@Star黾
这是一个伟大的你写的代码。帮我做几个项目。然而,在某些情况下,它有一定的局限性,我试图理解为什么。例如,这个-
x = 3 *π:0.1:3 *π;
y =兰德(1、尺寸(x, 2)) * 0.5 + sin (x);
yu = max (y);
yl = min (y);
年= (yu-yl);%的“y”
yz = y-yu +(年/ 2);
zci = @ (v)找到(v (:)。* circshift (v (:), 1, 1) < = 0);%返回的参数向量的近似零交点指数(> = R2016b)
zx = x (zci (yz));%找到零交点
每= 2 *意味着(diff (zx));%的估计时间
ym =意味着(y);%估计抵消
适合= @ (b, x) b(1) *(罪(2 *π* x。* b(2) + 2 *π* b (3))) + b (4);%的功能以适应
fcn = @ (b)和((适合(b, x) - y)。^ 2);%最小二乘成本函数
s = fminsearch (fcn[年;1 / /;1;ym])%减少最小二乘
s =
4×1
0.0501 0.4469 -1.5754 0.2469
xp = linspace(最小(x)最大(x));
图(1)
情节(x, y,“b”,xp,适合(年代,xp),“r”)
网格
明星黾
2023年3月7日
谢谢你!
我的代码有问题吵,过滤数据。
x = 3 *π:0.1:3 *π;
y =兰德(1、尺寸(x, 2)) * 0.5 + sin (x);
yf =低通滤波器(y, 0.01, 0.1);%低通滤波器
yu = max (yf);
yl = min (yf);
年= (yu-yl);%的“y”
yz = yf-yu +(年/ 2);
zci = @ (v)找到(diff(签署(v)));%返回的参数向量的近似零交点指数(> = R2016b)
zx = x (zci (yz));%找到零交点
每= 2 *意味着(diff (zx));%的估计时间
ym =意味着(y);%估计抵消
适合= @ (b, x) b(1) *(罪(2 *π* x。* b(2) + 2 *π* b (3))) + b (4);%的功能以适应
fcn = @ (b)和((适合(b, x) - yf)。^ 2);%最小二乘成本函数
s = fminsearch (fcn[年;1 / /;1;ym])%减少最小二乘
s =
4×1
1.0102 0.1584 -1.0002 0.2417
xp = linspace(最小(x)最大(x));
图(1)
情节(x, y,“b”,xp,适合(年代,xp),“r”)
网格
一旦噪音过滤掉这样的代码可以准确估计的参数筛选信号,它的工作原理。
我也更新了
“zci”
函数更健壮。
。
阿什法克·艾哈迈德
2023年3月7日
是的,这是现在好多了!出于好奇我有一个问题:我如何拯救“年代”的值如果我在for循环运行这段代码呢?像这样,
为i = 1:10
图(1)中,
x = 1:尺寸(x {}, 1);
y =意味着(SST (X{我}(1):{我}(结束),1:结束),2,“omitnan”)”;
yf =低通滤波器(y, 0.01, 0.1);%低通滤波器
yu = max (yf);
yl = min (yf);
年= (yu-yl);%的“y”
yz = yf-yu +(年/ 2);
zci = @ (v)找到(diff(签署(v)));%返回的参数向量的近似零交点指数(> = R2016b)
zx = x (zci (yz));%找到零交点
每= 2 *意味着(diff (zx));%的估计时间
ym =意味着(y);%估计抵消
适合= @ (b, x) b(1) *(罪(2 *π* x。* b(2) + 2 *π* b (3))) + b (4);%的功能以适应
fcn = @ (b)和((适合(b, x) - yf)。^ 2);%最小二乘成本函数
{我}= fminsearch (fcn,年;1 / /;1;ym])%减少最小二乘
xp = linspace(最小(x)最大(x));
结束
它说
不能执行任务,因为撑索引变量的不支持万博1manbetx
这类型。
明星黾
2023年3月7日
我没有数据,所以我不能运行这个测试它。
第一个选择preallocate细胞数组
“sc”
前循环:
sc =细胞(10,1);
后工序
“年代”
,保存它的元素
“sc”
:
sc{我}= s;
这应该工作。
。
赫克托耳卡米洛·克拉维诺萨拉特
2023年5月1日23:08
@Star黾
这就跟你问声好!很高兴见到你。我想问你如果你可以请分享正弦和代码提供的参数方程吗?我使用你的代码(在我的工作我会给你学分)和令人惊讶的是它的方法但我无法收集数据曲线方程本身,谢谢!
更多的答案(2)
乔斯(10584)
2014年3月14日
1评论
德扬
2014年3月15日
Im相对较新的Matlab,虽然有点让我提供的链接,它不是一个确切的一步一步的指导如何适应一个正弦波。
这是我的数据点:
x = [0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180)
y = [16.5 14.32 11.58 10.017 9.629 10.2 12.16 15.08 16.97 16.75 14.331 11.508 10.013 9.617 10.22 12.15 - 15.304 17.38 - 16.853)
我需要一个正弦波适合数据及其控制方程
另请参阅
一个错误发生
无法完成的行动,因为页面所做的更改。重新加载页面更新状态。
也seleccionar uno de来说《国家/语言:
科莫obtener el药对rendimiento
Seleccione中国(en语言斜纹棉布裤o单身)对位obtener el药对rendimiento。洛杉矶sitios web de还有《没有范围optimizados对位ser accedidos desde苏ubicacion geografica。