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

关于matlab曲线拟合

[复制链接]
发表于 2007-12-17 21:57:17 | 显示全部楼层 |阅读模式 来自 重庆沙坪坝区
我用隐函数画出了曲线图形(用ezplot),但是隐函数关系复杂,我想通过已经画出的曲线拟合出一个简单的显式方程表达式。。看了很多matlab的书,关于曲线拟合的不多,只有简单的几个线性之类的。。。。我的qq是 80319487,能否指点一二,谢谢。
                                问题补充:程序如下(这个程序可以画出一个曲线,我想把这条曲线拟合得到y=sqrt(a+x^2/b)这种方程表达式,要确定系数a与b):
syms x y
w=1.5.*pi;
u=x/sqrt(2).*sqrt(sqrt(1+(2.*w.^2.*y/x.^2).^2)-1);
v=x/sqrt(2).*sqrt(sqrt(1+(2.*w.^2.*y/x.^2).^2)+1);
z=2.*w.^2.*y.*(1-cos(u).*cosh(v))+x.^2.*sin(u).*sinh(v);
ezplot(z,[eps,16])
axis([eps,16,1,2.7])
title('y=x')
发表于 2007-12-18 13:42:55 | 显示全部楼层 来自 湖北武汉
Simdroid开发平台
简单的办法就是按照ezplot画出的图形导出点数据,再curve fitting toolbox里做拟合。再curve fitting toolbox里拟合曲线是很容易办到的,全图形界面,采用general equation方式建模,效果不错。导出ezplot画出的曲线数据可以按照下面的方法进行。
Step 1: 按照你给的代码画出隐函数图形,有些微改动,加个handle给ezplot命令,如下:
syms x y
w=1.5.*pi;
u=x/sqrt(2).*sqrt(sqrt(1+(2.*w.^2.*y/x.^2).^2)-1);
v=x/sqrt(2).*sqrt(sqrt(1+(2.*w.^2.*y/x.^2).^2)+1);
z=2.*w.^2.*y.*(1-cos(u).*cosh(v))+x.^2.*sin(u).*sinh(v);
h = ezplot(z,[eps,16]);

Step 2: 利用get命令导出曲线数据,注意你的函数实际上有五条曲线组成,你原先给的代码由于设置了axis范围,只显示出一条曲线,开始时候我给这个问题弄得有点糊涂了,后来才找到原因。所以曲线数据存储在XData和YData两个元胞里,可以如下方式调出:
x = get(h,'Xdata');
y = get(h,'Ydata');
xx = x{3,1}; yy = y{3,1}%我这里只调出五条中的第2条用于拟合,其他的类似做就好了

上面两部就导出了ezplot作出的图形数据,下面:
step 3: 再命令行下输入cftool,调出曲线拟合的图形界面
step 4:新建一个任务,以xx做横坐标数据,yy做纵坐标数据
step 5:采用general equation方式建模,输入你要拟合的公式就好了
step 6: Apply,就可以得到拟合好的曲线以及对应的a,b数值;

讨论:ezplot画出的图形似乎类似用contour命令得到的,得到了一组轮廓,存在XData和YData两个cell里,其中cell的第一元素不是真正的图形数据。以本问题为例,x{1,1},y{1,1}不是真正的数据,似乎是用来标记多条数据曲线分割位置用的。真正的数据存在x{2,1},y{2,1},  x{3,1},y{3,1},  x{4,1},y{4,1},  x{5,1},y{5,1},  x{6,1},y{6,1}里面。

还请各位高手多多指教。

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-5-10 18:27:45 | 显示全部楼层 来自 上海松江区
学习了!:victory:
回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

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

GMT+8, 2024-10-6 23:26 , Processed in 0.034837 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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