一般來說,你可以使用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)對於兩個方程應該是相同的,您是對的。我意識到這可能導致更大的錯誤,但由於它們具有相同的物理屬性,它們必須是相同的(兩個數據集都是通過對不同數量的一次測量獲取的)。如果我得到兩個不同的值,我不知道哪一個是「正確的」。另外我希望這可以排除一個參數被其中一個擬合擾亂但在另一個參數中很好(例如設置爲邊界值)的錯誤。 –