如果没有曲线拟合工具箱,您如何在MATLAB中使用函数来处理数据?
特别是,你如何拟合一个非多项式的函数,例如,如果我想拟合像y = x ^(1/3)+ 5这样的函数,它不是一个整数?
答案 0 :(得分:9)
如果您知道要拟合的函数的形式但不知道其参数,则可以使用fminsearch
查找适合您数据的参数。如果您想要适合y=x^a + b
a
和b
未知的数据(可能有噪音)(这里我假设真值为a=1/3
和{ {1}})这就是我的快速回答:
这里我生成了我的数据(你不必在现实生活中这样做)
b=5
然后,我根据>> x = linspace(0,5,10);
>> y = x.^(1/3) + 5;
>> y_noisy = y + 0.1*rand(size(y));
和a
定义我想要最小化的函数,并使用b
将其最小化。在这种情况下,我最小化了我的数据和拟合函数之间差异的平方的积分。下面我定义了两个函数,一个是噪声数据,一个是噪声。您可以看到,在没有噪音的情况下,您可以准确恢复fminsearch
和a
的值。
注意:b
wotks带有参数向量(在我的情况下为fminsearch
)。我带了v
和a=v(1)
。您还必须为b=v(2)
(此处v
)提供一些初步猜测。
[1 1]
上次评论,如果您对>> err_noisy = @(v) trapz(x,(y_noisy - x.^v(1)-v(2)).^2);
>> err = @(v) trapz(x,(y - x.^v(1)-v(2)).^2);
>> v_noisy = fminsearch(err_noisy,[1 1])
v_noisy =
0.3345 5.0594
>> v = fminsearch(err,[1 1])
v =
0.3333 5.0000
和a
的值有限制,则执行某些变量变更有时很有用。例如,如果您知道b
,则可能需要标识a>0
,然后将标识的值转换为log(a)
。
希望这有帮助。
一个。
答案 1 :(得分:3)
immoptibox是优化和数据拟合的免费工具箱。采用与@Adrien y = x^a + b
相同的样本函数,a
和b
使用来自immoptibox的marquardt
最小二乘法确定。
要解决此任务,需要两个文件。 sofit 会返回残差r
以及雅可比j
。
function [r, j] = sofit(x, fitData)
t = fitData(:,1);
y = fitData(:,2);
r = y - (t.^x(1) + x(2));
j = -[t.^x(1).*log(t), ones(length(t),1)];
end
以下 runner 脚本用于为示例函数生成数据点,并调用marquardt
进行数据拟合。
%% function template
f = @(t, p1, p2) t.^p1 + p2;
%% sample function
a = 1/3;
b = 5;
t= linspace(1,100)';
y = f(t, a, b);
%% packaging fit data for @sofit
fitData(:,1) = t;
fitData(:,2) = y;
%% marquardt
[xfit, info, perf] = marquardt(@sofit, [1, 1], [], fitData);
%% presentation
figure;
plot(y);
hold all
plot(f(t, xfit(1,end), xfit(2,end)), 'ro');
grid;
legend('sample function', 'fitted function', 'Location','East')
下图中生成的数据点(蓝色)与估计值(红色)。
答案 2 :(得分:1)
有两种方法可以实现没有ToolBox的曲线拟合,它们是
2.使用polyfit,从头开始创建自己的拟合工具箱......借助于此,您可以在MATLAB中为数据拟合函数,
doc polyfit。
例如
help polyfit;
help slash;
%...
有关polyfit的更多信息请参阅此http://www.mathworks.com/help/techdoc/ref/polyfit.html