从适合对象获取拟合数据

时间:2015-02-24 15:21:19

标签: matlab

我使用从描述fit的网站中获取的以下示例。返回一个 宾语。是否可以获取涉及拟合曲面的数据?

load franke
sf = fit([x, y],z,'poly23')
plot(sf,[x,y],z)

谢谢!

2 个答案:

答案 0 :(得分:3)

这是一种方法;但可能更清洁:

获取sf对象后,您可以访问其方法,如下所示:

MethodName(sf)

有关可用方法的列表,请参阅here

因此,假设您希望使用绘图的手柄绘制曲面:

hPlot = plot(sf)

enter image description here

然后您可以使用句柄来获取XDataYDataZData,如下所示:

X = get(hPlot,'XData')
Y = get(hPlot,'YData')
Z = get(hPlot,'ZData')

可能很麻烦,但它有效。请注意,您也可以像这样获取拟合曲面的系数:

coeffvalues(sf)

以及用于生成它的公式:

formula(sf)

因此,您可以使用meshgrid生成X,Y数据并创建Z值,然后您可以根据需要修改曲面。

编辑以下是使用系数和公式创建自己曲面的方法。在这里,我创建了一个带有两个输入参数(x和y)的匿名函数,并使用它来生成z值以进行绘制。根据使用plot(sf)获得的数据,我使用x = 1:0.01:0.01:1y = 500:500:3000,但您显然可以更改它们。

我在函数句柄中手动输入了公式,但必须有更好的方法;我有点匆忙,所以我没有进一步研究,但你可以提取公式的每个元素,并将其乘以正确的系数,以自动生成公式。

以下是整个代码:

clear
clc
close all

load franke
sf = fit([x, y],z,'poly23')

c = coeffvalues(sf)
F = formula(sf)

%// Generate x and y values.
[x,y] = meshgrid(500:100:3000,0.01:.01:1);

%// There should be a better approach than manually entering the data haha.
%// Maybe use eval or feval.
MyFun = @(x,y) (c(1) + c(2)*x + c(3)*y +c(4)*x.^2 + c(5)*x.*y + c(6)*y.^2 + c(7)*(x.^2).*y + c(8)*x.*y.^2 + c(9)*y.^3);

%// Generate z data to create a surface
z = (MyFun(x,y));

figure

subplot(1,2,1)
plot(sf)
title('Plot using sf','FontSize',18)

subplot(1,2,2)
surf(x,y,z)
title('Plot using MyFun','FontSize',18)

输出:

enter image description here

答案 1 :(得分:1)

[我知道这是很多年后的事,但我想为以后寻求答案的访客添加此内容]

有一种更简单的方法-使用feval或通过调用fittype对象本身的隐式快捷方式。当我需要它时确实花了一些时间去寻找它,这并不是特别明显。

来自feval MATLAB documentation

标准feval语法:

y = feval(cfun,x)
z = feval(sfun,[x,y])
z = feval(sfun,x,y)
y = feval(ffun,coeff1,coeff2,...,x)
z = feval(ffun,coeff1,coeff2,...,x,y)

您可以使用feval来评估拟合,但是建议使用以下更简单的语法来评估这些对象,而不是直接调用feval。您可以将适合对象视为函数,并使用以下语法间接调用feval

y = cfun(x)        % cfit objects;
z = sfun(x,y)      % sfit objects 
z = sfun([x, y])   % sfit objects 
y = ffun(coef1,coef2,...,x)   % curve fittype objects;
z = ffun(coef1,coef2,...,x,y) % surface fittype objects;