找回密码
 注册
Simdroid-非首页
查看: 272|回复: 12

一组(闭合的)离散点如何拟合成光滑曲线!(离散点/闭合曲线/拟合/插值)[有代码]

[复制链接]
发表于 2010-10-13 23:09:53 | 显示全部楼层 |阅读模式 来自 华南理工大学
本帖最后由 messenger 于 2010-10-14 20:52 编辑

大家好,我还里有关于离散点拟合成闭合曲线的问题:
首先我有一组节点,节点坐标为:
x=[1.7561;1.8333;2;2.1517;2.1667;2.3333;2.5;2.6667;2.8333;3;3.1667;3.3333;3.5;3.6667;3.8333;4;4.0996;4.1372;4.0654;4;3.9701;3.8333;3.804;3.7503;3.6667;3.5;3.4068;3.3333;3.1667;3.0558;3;2.8333;2.7151;2.6667;2.5;2.398;2.3333;2.1886;2.1667;2;1.897;1.8333;1.7561];
y=[0.8333;0.7561;0.7671;0.8333;0.8356;0.8503;0.8627;0.8627;0.8627;0.8627;0.8627;0.8627;0.8627;0.8627;0.8676;0.9004;1;1.1667;1.3333;1.3987;1.5;1.6368;1.6667;1.8333;1.9169;1.9265;1.8333;1.804 ;1.7775;1.6667;1.6373;1.6182;1.5;1.4707;1.4354;1.3333;1.3031;1.1667;1.1454;1.103 ;1;0.9106;0.8333];
如果将这些节点依次连接成直线的话:
plot(x,y);hold on;plot(x,y,'o');
会形成一个闭合区域;
但是如下面第一幅图所示,连接成的线段会成锯齿形的边界不光滑。
现在我的目标是希望达到类似于最小二乘法拟合原理似的,将这些点拟合成一个闭合且光滑的曲线!
达到类似于第二幅图的目标。
请各位大侠帮帮忙啊!谢谢大家!有些急啊,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2010-10-14 10:59:52 | 显示全部楼层 来自 河北秦皇岛
Simdroid开发平台
你用ployfit函数试试,应该是可以实现的
回复 不支持

使用道具 举报

 楼主| 发表于 2010-10-14 15:50:21 | 显示全部楼层 来自 华南理工大学
x=[1.7561;1.8333;2;2.1517;2.1667;2.3333;2.5;2.6667;2.8333;3;3.1667;3.3333;3.5;3.6667;3.8333;4;4.0996;4.1372;4.0654;4;3.9701;3.8333;3.804;3.7503;3.6667;3.5;3.4068;3.3333;3.1667;3.0558;3;2.8333;2.7151;2.6667;2.5;2.398;2.3333;2.1886;2.1667;2;1.897;1.8333;1.7561];
y=[0.8333;0.7561;0.7671;0.8333;0.8356;0.8503;0.8627;0.8627;0.8627;0.8627;0.8627;0.8627;0.8627;0.8627;0.8676;0.9004;1;1.1667;1.3333;1.3987;1.5;1.6368;1.6667;1.8333;1.9169;1.9265;1.8333;1.804 ;1.7775;1.6667;1.6373;1.6182;1.5;1.4707;1.4354;1.3333;1.3031;1.1667;1.1454;1.103 ;1;0.9106;0.8333];
plot(x,y);hold on;
a=polyfit(x,y,15);
x1=min(x):(max(x)-min(x))/100:max(x);
y1=polyval(a,x1);
plot(x1,y1,'r');

我之前试过polyfit
1、拟合不好;2、无法拟合成闭合曲线。

请大家帮帮忙啊!想想新思路啊,谢谢!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2010-10-14 18:27:05 | 显示全部楼层 来自 四川成都
你这个图形确实不怎么好拟合。
什么函数拟合都不好使,而且图还是闭合的。
如果楼主只是想得到一个光滑的曲线图的话。
可以在CAD中画的。

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-10-14 19:54:37 | 显示全部楼层 来自 黑龙江哈尔滨
试试分段拟合
回复 不支持

使用道具 举报

发表于 2010-10-14 20:15:55 | 显示全部楼层 来自 北京
本帖最后由 bainhome 于 2010-10-14 20:17 编辑
什么函数拟合都不好使...

是吗?
  1. function points_contact
  2. x=[1.7561;1.8333;2;2.1517;2.1667;2.3333;2.5;2.6667;2.8333;3;3.1667;3.3333;3.5;3.6667;3.8333;4;4.0996;4.1372;4.0654;4;3.9701;3.8333;3.804;3.7503;3.6667;3.5;3.4068;3.3333;3.1667;3.0558;3;2.8333;2.7151;2.6667;2.5;2.398;2.3333;2.1886;2.1667;2;1.897;1.8333;1.7561];
  3. y=[0.8333;0.7561;0.7671;0.8333;0.8356;0.8503;0.8627;0.8627;0.8627;0.8627;0.8627;0.8627;0.8627;0.8627;0.8676;0.9004;1;1.1667;1.3333;1.3987;1.5;1.6368;1.6667;1.8333;1.9169;1.9265;1.8333;1.804 ;1.7775;1.6667;1.6373;1.6182;1.5;1.4707;1.4354;1.3333;1.3031;1.1667;1.1454;1.103 ;1;0.9106;0.8333];
  4. points=[x;y];
  5. x0=mean(x);y0=mean(y); % the center point
  6. r=sqrt((x-x0).^2+(y-y0).^2); % the radius
  7. theta=acos((x-x0)./r); %the angle
  8. index=(y-y0)<0;
  9. theta(index)=2*pi-theta(index); %计算各个点的角度
  10. [theta,i1]=sort(theta);
  11. r1=r(i1);
  12. xi=x0+r1.*cos(theta);
  13. yi=y0+r1.*sin(theta);
  14. points=[[xi;xi(1)],[yi;yi(1)]]';
  15. curve=cscvn(points);
  16. fnplt(curve);
  17. hold on;
  18. plot(points(1,:),points(2,:),'o')
  19. hold off
复制代码

这个算法就写在楼主翻出的旧帖里,简简单单的事情,居然也能找不到,意外...
bzzz老弟所给算法是核心,但是他的代码应用在楼主数据里没过去,切比雪夫插值或者样条插值命令处还有点儿小麻烦,上下文我没细看,但是估计调一下应该没大问题。
要想更光滑更简单——少取几个点。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-10-15 12:58:45 | 显示全部楼层 来自 广东广州
谢谢bainhome的回复!!

事实上我用过bzzz的方法做过!
但跟我的目标不同:
1、我所希望是达到拟合的效果,并非一定要经过所有点进行光滑插值
2、“要想更光滑更简单——少取几个点”——不同的离散点情况,无法一次性确定少取哪些点(我需要一次实现拟合成光滑闭合曲线);

谢谢大家的想法,版主的“分段拟合”,我会试试,不知是否会把问题复杂化。
回复 不支持

使用道具 举报

发表于 2010-10-15 13:49:44 | 显示全部楼层 来自 北京
本帖最后由 bainhome 于 2010-10-15 14:05 编辑
1、我所希望是达到拟合的效果,并非一定要经过所有点进行光滑插值;

主题内无明确文字信息,why?
不同的离散点情况,无法一次性确定少取哪些点

不同离散情况的说明主题信息中同样未给,why?
分段拟合同样存在关键点的选择,机器不知道哪些点的拟合会令你满意,关键点取舍思路或涉及专业,或涉及拟合要求,人为因素很多,个人以为只能实现“半自动”。拟合封闭曲线如非具有函数明显特质(如椭圆拟合)的个别情况,bzzz的化直角坐标为极坐标然后遴选插值方式的思想已比较合理。

当“不同离散点”、“封闭曲线拟合”这种关键词出现时,问题就已经复杂化了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2010-10-15 19:28:16 | 显示全部楼层 来自 广东广州
bainhome一些讲的很有道理!谢谢!

1、主题的第二幅图的红色闭合曲线,我提到过是我希望的目标;
2、来这里发帖请教大家,是希望能够请像bainhome一样的高手出手解决这类情况的拟合问题,并非就这组离散点。

谢谢大家!谢谢!
回复 不支持

使用道具 举报

发表于 2010-10-16 14:48:28 | 显示全部楼层 来自 福建福州
你试试用spline
回复 不支持

使用道具 举报

发表于 2010-10-17 10:07:10 | 显示全部楼层 来自 湖北武汉
我想将你这个曲线分成上下两部分分别进行拟合。
回复 不支持

使用道具 举报

发表于 2010-10-18 17:18:48 | 显示全部楼层 来自 北京
同学们,回答问题要先看前面的讨论,要替提问者负责任,不能随口轻飘飘说话,误导提问者啊。
1.spline这个命令在bzzz原帖基本思想中早已经使用,而且这根本不是重点。
2.分成上下两部分拟合有两个问题:
第一、两部分的相交点如何保证光滑?即:一阶或二阶导数值的相等?
第二、同样存在点选取的问题,如何针对不同情况自动完成?
上面全部是侧重这两个问题的探讨,如果就一两个命令那么简单,这里稍微熟悉软件的人就能解决,bzzz的原讨论也不会被设精华了
回复 不支持

使用道具 举报

发表于 2011-9-18 10:11:12 | 显示全部楼层 来自 江苏扬州
本帖最后由 stats01 于 2011-9-18 10:11 编辑

clear,clc
fx1=@(b,x)b(1)+b(2)*x.^b(3) + b(4)*x.^3+ b(5)*x.^2 +b(6)*x;
fx2=@(b,x)b(1)+b(7)*x.^b(8) + b(9)*x.^3+ b(10)*x.^2 +b(11)*x;
x=[0    0    0.0772    0.0772    0.1409    0.2439    0.2439    0.3956    0.4106    0.4106    0.4325    0.5772    0.5772    0.6419    0.7439    0.7439    0.9106    0.9106    0.959    1.0772    1.0772    1.2439    1.2439    1.2997    1.4106    1.4106    1.5772    1.5772    1.6507    1.7439    1.7439    1.9106    1.9106    1.9942    2.0479    2.0772    2.0772    2.214    2.2439    2.2439    2.3093    2.3435    2.3811]';
y=[0.8333    0.8333    0.7561    0.9106    1    0.7671    1.103    0.8333    0.8356    1.1454    1.1667    0.8503    1.3031    1.3333    0.8627    1.4354    0.8627    1.4707    1.5    0.8627    1.6182    0.8627    1.6373    1.6667    0.8627    1.7775    0.8627    1.804    1.8333    0.8627    1.9265    0.8627    1.9169    1.8333    1.6667    0.8676    1.6368    1.5    0.9004    1.3987    1.3333    1    1.1667]';
x1=linspace(0,2.438);
b=[0.817731470822958,-0.660171615762068,0.566416207806644,0.159008423164863,-0.676688824702786,1.23360131960106,-560.036919356186,1.99547820437660,-1.16910821815770,559.796257923457,2.12294518543622];
figure(1),clf
plot(x,y,'o','markersize',10,'markerfacecolor','k')
y1=fx1(b,x1);
y2=fx2(b,x1);
hold on
plot(x1,y1,'r-',x1,y2,'r-','linewidth',3)
legend('data','fit','location','best')

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-6 08:59 , Processed in 0.071382 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表