一般来说,你可以使用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
请注意,在“贝塔斯”我保持参数和“x”我保持数据。为了给函数f和g加权,我必须引入一个新变量“lambda”。这很好,因为不同的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);
这必须工作!
对于两个方程式,您只需要一个(a,b)的one_set。我对吗?所以你必须意识到这可能会给模型带来更多关于你的数据集的错误。 – Mohammad
是的,参数集(a,b)对于两个方程应该是相同的,您是对的。我意识到这可能导致更大的错误,但由于它们具有相同的物理属性,它们必须是相同的(两个数据集都是通过对不同数量的一次测量获取的)。如果我得到两个不同的值,我不知道哪一个是“正确的”。另外我希望这可以排除一个参数被其中一个拟合扰乱但在另一个参数中很好(例如设置为边界值)的错误。 –