MATLAB 中的指数曲线拟合不佳
Poor exponential curve fitting in MATLAB
我在 Matlab 中得到的指数曲线拟合结果很差。在 excel 中,指数趋势线产生 excel 贷款结果(恕我直言)。我在 Matlab 中做错了什么?
示例数据集:
1,0
1,0
0,8
0,8
0,8
0,8
1,1
1,1
0,9
0,9
0,8
0,8
0,8
0,8
0,7
0,7
0,6
0,6
0,7
0,7
1,1
1,1
1,0
1,0
0,9
0,9
0,8
0,8
0,9
0,9
2,1
2,1
1,9
1,9
2,1
2,1
6,5
6,5
6,0
6,0
5,7
5,7
6,4
6,4
11,1
11,1
10,9
10,9
10,2
10,2
8,5
8,5
12,6
12,6
11,8
11,8
9,9
9,9
11,6
11,6
10,6
10,6
9,7
9,7
9,6
9,6
8,2
8,2
10,1
10,1
9,0
9,0
9,0
9,0
8,9
8,9
8,9
8,9
8,2
8,2
11,8
11,8
15,8
15,8
13,1
13,1
14,8
14,8
13,4
13,4
13,6
13,6
15,4
15,4
16,9
16,9
16,7
16,7
25,9
25,9
23,4
23,4
24,5
24,5
26,6
26,6
24,2
24,2
22,7
22,7
21,2
21,2
21,0
21,0
17,3
17,3
42,1
42,1
40,8
40,8
41,3
41,3
39,7
39,7
42,4
42,4
42,6
42,6
89,0
89,0
196,2
196,2
228,1
228,1
385,4
385,4
746,7
746,7
701,8
701,8
633,7
633,7
1051,2
1051,2
1083,1
1083,1
1034,6
1034,6
1096,0
1096,0
1010,5
1010,5
1001,5
1001,5
835,6
835,6
886,1
886,1
1038,2
1038,2
867,4
867,4
821,8
821,8
753,8
753,8
704,5
704,5
616,4
616,4
555,5
555,5
854,1
854,1
产量
y = 0,4734*e^0,0442x, hence a = 0,4734 and b = 0,0442
但在 Matlab 中,代码为:
curveFitValues = fit(xdata,ydata,'exp1');
a = curveFitValues.a;
b = curveFitValues.b;
产量
y = 8,6631*e^0,0280x, hence a = 8,661 and b = 0,0280
结果不令人满意,如下图所示:
image
我做错了什么?
P.S:我需要对数百万个数据集进行指数曲线拟合并尝试找到最快的算法,有什么想法是最快的方法吗?
我已经使用 polyfit
函数成功拟合了您的数据。我没有曲线拟合工具箱,但通常只需使用 polyfit
就可以了。我在我的代码中将您的数据存储为变量 x
。
t = 1:numel(x);
p = polyfit(t, log(x), 1);
figure; hold on
plot(x)
plot(t, exp(p(2)) * exp(p(1)*t))
set(gca, 'yscale', 'log')
hold off
此代码采用 ln(x)
并使用最小二乘法将其拟合到 t
。然后当你产生情节时你就转换回去。
p
具有值 p(1) = 0.0442
和 exp(p(2)) = 0.4375
.
我在 Matlab 中得到的指数曲线拟合结果很差。在 excel 中,指数趋势线产生 excel 贷款结果(恕我直言)。我在 Matlab 中做错了什么?
示例数据集:
1,0 1,0 0,8 0,8 0,8 0,8 1,1 1,1 0,9 0,9 0,8 0,8 0,8 0,8 0,7 0,7 0,6 0,6 0,7 0,7 1,1 1,1 1,0 1,0 0,9 0,9 0,8 0,8 0,9 0,9 2,1 2,1 1,9 1,9 2,1 2,1 6,5 6,5 6,0 6,0 5,7 5,7 6,4 6,4 11,1 11,1 10,9 10,9 10,2 10,2 8,5 8,5 12,6 12,6 11,8 11,8 9,9 9,9 11,6 11,6 10,6 10,6 9,7 9,7 9,6 9,6 8,2 8,2 10,1 10,1 9,0 9,0 9,0 9,0 8,9 8,9 8,9 8,9 8,2 8,2 11,8 11,8 15,8 15,8 13,1 13,1 14,8 14,8 13,4 13,4 13,6 13,6 15,4 15,4 16,9 16,9 16,7 16,7 25,9 25,9 23,4 23,4 24,5 24,5 26,6 26,6 24,2 24,2 22,7 22,7 21,2 21,2 21,0 21,0 17,3 17,3 42,1 42,1 40,8 40,8 41,3 41,3 39,7 39,7 42,4 42,4 42,6 42,6 89,0 89,0 196,2 196,2 228,1 228,1 385,4 385,4 746,7 746,7 701,8 701,8 633,7 633,7 1051,2 1051,2 1083,1 1083,1 1034,6 1034,6 1096,0 1096,0 1010,5 1010,5 1001,5 1001,5 835,6 835,6 886,1 886,1 1038,2 1038,2 867,4 867,4 821,8 821,8 753,8 753,8 704,5 704,5 616,4 616,4 555,5 555,5 854,1 854,1
产量
y = 0,4734*e^0,0442x, hence a = 0,4734 and b = 0,0442
但在 Matlab 中,代码为:
curveFitValues = fit(xdata,ydata,'exp1');
a = curveFitValues.a;
b = curveFitValues.b;
产量
y = 8,6631*e^0,0280x, hence a = 8,661 and b = 0,0280
结果不令人满意,如下图所示:
image
我做错了什么?
P.S:我需要对数百万个数据集进行指数曲线拟合并尝试找到最快的算法,有什么想法是最快的方法吗?
我已经使用 polyfit
函数成功拟合了您的数据。我没有曲线拟合工具箱,但通常只需使用 polyfit
就可以了。我在我的代码中将您的数据存储为变量 x
。
t = 1:numel(x);
p = polyfit(t, log(x), 1);
figure; hold on
plot(x)
plot(t, exp(p(2)) * exp(p(1)*t))
set(gca, 'yscale', 'log')
hold off
此代码采用 ln(x)
并使用最小二乘法将其拟合到 t
。然后当你产生情节时你就转换回去。
p
具有值 p(1) = 0.0442
和 exp(p(2)) = 0.4375
.