我正在寻找一种方法来拟合具有不同拟合模型的两个不同数据集,但取决于Matlab中的相同参数。到目前为止我找到的所有解决方案要么不是用于matlab,要么不处理这个确切的问题。
以下是我的问题的粗略示例: 我已经获得了两个应采用这些形式的数据集:
数据集1:f(x) = a*exp(x)+b
数据集2:g(x) = atan(b*x/a)
真正的公式更复杂但原则应该相同。
当我尝试使用NonlinearLeastSquares独立地拟合它们时,matlab显然为两个不同的数据集提供了变量a
和b
的不同值。我尝试将一种解决方案作为起点提供给另一种拟合程序但很少提高准确性。有没有办法告诉Matlab同时适合两个数据集,或者至少找到最适合bost模型的变量?
答案 0 :(得分:2)
通常,您可以使用fmincon来执行此操作。我们的想法是定义一个将f(x)和g(x)都考虑在内的函数。
让我们这样做。
function error2 = myFunction(betas,x)
lambda=0.5;
error2=0;
a=betas(1,1);
b=betas(2,1);
x1=x(:,1); %Assuming that both datasets have the same size. If they are not you can adjust it
y1=x(:,2);
x2=x(:,3);
y2=x(:,4);
n=size(x,1);
for i=1:n
f1=a*exp(x1(i,1))+b;
f2=atan(b*x2(i,1)/a);
error2=error2+lambda*(y1(i,1)-f1)^2 + (1-lambda)*(y2(i,1)-f2)^2;
end
请注意,在“beta”中我保留参数和“x”我保留数据。我不得不引入一个新变量“lambda”来加权函数f和g。这很好,因为变化的lambda你能够看到其中一个函数如何影响另一个函数的估计。实际上,您可以从lambda = 0开始,并对此例程运行多次,例如0.1,0.2,...,1。
现在你必须使用fmincon来调用这个函数。
clear all
close all
% Here you have to create your data x: Remember the structure I used for x=[x1,y1,x2,y2]
x1=
y1=
x2=
y2=
x=[x1,y1,x2,y2];
% you need to initiate the values of your parameters beta
a0=
b0=
beta0(1,1)=a0;
beta0(2,1)=b0;
beta = fmincon(@(beta)myFunction(beta,x), beta0);
这必须有效!
答案 1 :(得分:0)
离墙,但尝试拟合:
f(x)+g(x) = a*exp(x)+b + atan(b*x/a)
我知道如果f(x)&的幅度不会起作用(可能很少) g(x)不匹配,因为这两个不同部分的错误(你正在最小化)将是不相等的,你最终将最终拟合一个函数或另一个函数。