Matlab 无工具箱曲线拟合
如果没有曲线拟合工具箱,如何将函数拟合到MATLAB中的数据Matlab 无工具箱曲线拟合,matlab,Matlab,如果没有曲线拟合工具箱,如何将函数拟合到MATLAB中的数据 特别是,如何拟合非多项式函数,例如,如果我想拟合y=x^(1/3)+5这样的非整数函数?在没有工具箱的情况下实现曲线拟合有两种方法,它们是 如果采样间隔均匀,然后希望使用移位核的某些线性组合(例如B样条曲线)进行曲线拟合,则以下工具将帮助您: 2.使用polyfit从头开始创建自己的配件工具箱。。。借助于此,您可以将函数拟合到MATLAB中的数据 波利菲特医生 例如 % 有关polyfit的更多信息,请参阅此如果您知道要安装的函数的
特别是,如何拟合非多项式函数,例如,如果我想拟合y=x^(1/3)+5这样的非整数函数?在没有工具箱的情况下实现曲线拟合有两种方法,它们是
有关polyfit的更多信息,请参阅此如果您知道要安装的函数的形式,但不知道其参数,则可以使用
fminsearch
查找适合数据的参数。如果您有数据(可能有噪音),您希望适合y=x^a+b
,其中a
和b
是未知的(这里我将假设真实值是a=1/3
和b=5
),这就是我得到快速答案的方式:
在这里,我生成数据(在现实生活中,您不必这样做)
然后,我定义了我想要最小化的函数,它与a
和b
有关,并使用fminsearch
将其最小化。在这种情况下,我最小化了数据和拟合函数之间差平方的积分。下面我定义了两个函数,一个是有噪声的数据,另一个是无噪声的。您可以看到,在没有噪声的情况下,您可以准确地恢复a
和b
的值
注意:fminsearch
wotks与参数向量(v
在我的例子中)。我选了a=v(1)
和b=v(2)
。您还必须为v
(此处[1]
)提供一些初始猜测
最后一条注释,如果您对a
和b
的值有限制,则有时可以对变量进行一些更改。例如,如果您知道a>0
,则可能需要标识log(a)
,然后将标识的值转换为a
希望这有帮助
A.是一个用于优化和数据拟合的免费工具箱。采用与@Adrieny=x^a+b
相同的样本函数,a
和b
使用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
以下运行程序脚本用于为示例函数生成数据点,并调用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')
下图中生成的数据点(蓝色)与估计的数据点(红色)
>> 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
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
%% 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')