lysgreat 发表于 2010-10-13 23:09:53

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

本帖最后由 messenger 于 2010-10-14 20:52 编辑

大家好,我还里有关于离散点拟合成闭合曲线的问题:
首先我有一组节点,节点坐标为:
x=;
y=;
如果将这些节点依次连接成直线的话:
plot(x,y);hold on;plot(x,y,'o');
会形成一个闭合区域;
但是如下面第一幅图所示,连接成的线段会成锯齿形的边界不光滑。
现在我的目标是希望达到类似于最小二乘法拟合原理似的,将这些点拟合成一个闭合且光滑的曲线!
达到类似于第二幅图的目标。
请各位大侠帮帮忙啊!谢谢大家!有些急啊,谢谢!

Walker0728 发表于 2010-10-14 10:59:52

你用ployfit函数试试,应该是可以实现的

lysgreat 发表于 2010-10-14 15:50:21

x=;
y=;
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、无法拟合成闭合曲线。

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

chenzhian 发表于 2010-10-14 18:27:05

你这个图形确实不怎么好拟合。
什么函数拟合都不好使,而且图还是闭合的。
如果楼主只是想得到一个光滑的曲线图的话。
可以在CAD中画的。

messenger 发表于 2010-10-14 19:54:37

试试分段拟合

bainhome 发表于 2010-10-14 20:15:55

本帖最后由 bainhome 于 2010-10-14 20:17 编辑

什么函数拟合都不好使...
是吗?function points_contact
x=;
y=;
points=;
x0=mean(x);y0=mean(y); % the center point
r=sqrt((x-x0).^2+(y-y0).^2); % the radius
theta=acos((x-x0)./r); %the angle
index=(y-y0)<0;
theta(index)=2*pi-theta(index); %计算各个点的角度
=sort(theta);
r1=r(i1);
xi=x0+r1.*cos(theta);
yi=y0+r1.*sin(theta);
points=[,]';
curve=cscvn(points);
fnplt(curve);
hold on;
plot(points(1,:),points(2,:),'o')
hold off
这个算法就写在楼主翻出的旧帖里,简简单单的事情,居然也能找不到,意外...
bzzz老弟所给算法是核心,但是他的代码应用在楼主数据里没过去,切比雪夫插值或者样条插值命令处还有点儿小麻烦,上下文我没细看,但是估计调一下应该没大问题。
要想更光滑更简单——少取几个点。

lysgreat 发表于 2010-10-15 12:58:45

谢谢bainhome的回复!!

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

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

bainhome 发表于 2010-10-15 13:49:44

本帖最后由 bainhome 于 2010-10-15 14:05 编辑

1、我所希望是达到拟合的效果,并非一定要经过所有点进行光滑插值;
主题内无明确文字信息,why?
不同的离散点情况,无法一次性确定少取哪些点
不同离散情况的说明主题信息中同样未给,why?
分段拟合同样存在关键点的选择,机器不知道哪些点的拟合会令你满意,关键点取舍思路或涉及专业,或涉及拟合要求,人为因素很多,个人以为只能实现“半自动”。拟合封闭曲线如非具有函数明显特质(如椭圆拟合)的个别情况,bzzz的化直角坐标为极坐标然后遴选插值方式的思想已比较合理。

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

lysgreat 发表于 2010-10-15 19:28:16

bainhome一些讲的很有道理!谢谢!

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

谢谢大家!谢谢!

yuyehuang88714 发表于 2010-10-16 14:48:28

你试试用spline

wuyuan 发表于 2010-10-17 10:07:10

我想将你这个曲线分成上下两部分分别进行拟合。

bainhome 发表于 2010-10-18 17:18:48

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

stats01 发表于 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=';
y=';
x1=linspace(0,2.438);
b=;
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')
页: [1]
查看完整版本: 一组(闭合的)离散点如何拟合成光滑曲线!(离散点/闭合曲线/拟合/插值)[有代码]