我使用从描述fit的网站中获取的以下示例。返回一个 宾语。是否可以获取涉及拟合曲面的数据?
load franke
sf = fit([x, y],z,'poly23')
plot(sf,[x,y],z)
谢谢!
答案 0 :(得分:3)
这是一种方法;但可能更清洁:
获取sf
对象后,您可以访问其方法,如下所示:
MethodName(sf)
有关可用方法的列表,请参阅here
因此,假设您希望使用绘图的手柄绘制曲面:
hPlot = plot(sf)
然后您可以使用句柄来获取XData
,YData
和ZData
,如下所示:
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:1
和y = 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)
输出:
答案 1 :(得分:1)
[我知道这是很多年后的事,但我想为以后寻求答案的访客添加此内容]
有一种更简单的方法-使用feval
或通过调用fittype对象本身的隐式快捷方式。当我需要它时确实花了一些时间去寻找它,这并不是特别明显。
标准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;