问一个简单的算法问题, 从曲线拟合出一条直线

captainwh 2005-12-12 10:29:17
比如数据显示为一条曲线, 曲线基本可以分为两个部分: 弹性部分和非弹性部分
在弹性部分, 表现为近似一条直线, 就是说曲线的曲度非常小; 到了非弹性部分, 曲线的弯曲度就变化很大了

现在需要通过程序对曲线数据的分析, 将弹性部分和非弹性部分区分开来, 并且为弹性部分拟合出一条近似直线, 求其斜率

曲线数据(x, y), 请问有哪些数学方法可用的, 最好能说下原理, 对这些数学上的东西不熟悉, 感觉程序还是容易实现的
...全文
518 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
captainwh 2005-12-12
  • 打赏
  • 举报
回复
比较麻烦的是曲线中可能存在毛刺
即弹性段中突然出现一个尖锐的突起
雨中的月儿 2005-12-12
  • 打赏
  • 举报
回复
用最小二乘法吧,计算复杂度不能保证,不过,会满足你的要求。

具体看看 概率论与数理统计 这本书。
captainwh 2005-12-12
  • 打赏
  • 举报
回复
欢迎再提出其他的好方法
captainwh 2005-12-12
  • 打赏
  • 举报
回复
试试楼上的方法, 看看效果如何吧
感觉最小二乘怎么的也该比我程序里现在的办法好些
寻开心 2005-12-12
  • 打赏
  • 举报
回复
上面的方法实际上就是逆合出来了,整条曲线的斜率的变化趋势

显然,弹性部分的不同段的斜率都是很相近的,而其他的部分就不同
只要找出最相近并且相邻的区域就是弹性区域,此外就是非弹性的
寻开心 2005-12-12
  • 打赏
  • 举报
回复
初步想法,针对二维的曲线的时候

根据数据的范围,把x坐标划分成若干段,段不妨划分的细一些
在每个段当中用最小二乘逆合直线,获得斜率
然后比较这些段当中的斜率
如果相邻的两个段的斜率很接近,那么证明这两个数据段的数据,近似于一条直线
类似的可以把弹性部分合并到一起了

而后面的非弹性的部分,由于相邻的段的斜率变化比较大,和前面的分不到一起去的
captainwh 2005-12-12
  • 打赏
  • 举报
回复
目前想到的笨办法是从曲线第二点开始, 依次求其与第一点之间直线的斜率, 第一次计算结果(1, 2点间直线斜率)作为初始斜率, 将之后每次计算结果与初始斜率比较, 当偏差大于一定程度时, 认为该点是弹性段与非弹性段的分界点

不过老实说自己也感觉这么干比较笨, 数据应该也不准确, 我想应该有些专门的数学方法来做这种事情的吧
寻开心 2005-12-12
  • 打赏
  • 举报
回复
最小二乘逆合后,用逆合的结果来修正一下原始的数据,
剔除距离逆合出来的直线比较远的数据,然后用剩余的数据再次重新逆合以得到更准确的斜率。

如果你是已知曲线的函数类型,应该使用非线性最小二乘直接逆合曲线
然后根据曲线的参数来确定弹性和非弹性的区间的

19,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧