在数学和绘图的帮助下,为方程
y = mx + c
找到m
和c
。y
是data_model_1
,x
是时间。 避免使用其他 MATLAB 函数,例如fitlm
,因为它违背了目的。
我无法找到常量m
和c
。我试图通过将m
和c
限制在一个范围内(基于智能猜测(来找到它们,我需要根据平均误差范围推断m
和c
值。平均误差范围最接近 0 的点应该是我的m
和c
值。
load(file)
figure
plot(time,data_model_1,'bo')
hold on
for a = 0.11:0.01:0.13
c = -13:0.1:-10
data_a = a * time + c ;
plot(time,data_a,'r');
end
figure
hold on
for a = 0.11:0.01:0.13
c = -13:0.1:-10
data_a = a * time + c ;
mean_range = mean(abs(data_a - data_model_1));
plot(a,mean_range,'b.')
end
快速而肮脏的方法
您可以使用fminsearch()
快速获得m
和c
。 在下面的第一个示例中,误差函数是误差平方和(SSE(。 第二个示例使用绝对误差的总和。 这里的关键是确保误差函数是凸的。
请注意,c = Beta(1)
和m = Beta(2)
。
可重现的示例(MATLAB 代码[1](:
% Generate some example data
N = 50;
X = 2 + 13*random(makedist('Beta',.7,.8),N,1);
Y = 5 + 1.5.*X + randn(N,1);
% Example 1
SSEh =@(Beta) sum((Y - (Beta(1) + (Beta(2).*X))).^2);
Beta0 = [0.5 0.5]; % Initial Guess
[Beta SSE] = fminsearch(SSEh,Beta0)
% Example 2
SAEh =@(Beta) sum(abs(Y-(Beta(1) + Beta(2).*X)));
[Beta SumAbsErr] = fminsearch(SAEh,Beta0)
这是一种快速而肮脏的方法,适用于许多应用程序。
@Wolfie的评论将引导您使用运算符或
mldivide()
求解线性方程组的解析方法。这是更正确的方法(尽管它会得到类似的答案(。需要注意的是,这种方法得到了SSE的答案。
[1] 使用 MATLAB R2018a 进行测试