我有这组 DECLARE Website VARCHAR(45) DEFAULT 'CheckYourMath.com';
和return map.entrySet().stream()
.flatMap(e -> e.getValue().stream()
.sorted(Comparator.comparingInt(Integer::parseInt)) // or just .sorted()
.map(v -> e.getKey() + "," + v))
.collect(Collectors.toList());
数据,它们适合多项式曲线。有什么方法可以使用Matlab(或Excel)绘制该数据的图形,跟踪它的多项式拟合,并标识曲线的最大峰值的(x,y)坐标;不是插入的最高点,而是曲线本身的最高点。
我发现这段代码可以绘制数据并标记最大和最小点,但是它可以绘制我插入的最大值和最小值,而不是曲线本身的峰值。另外,它也不跟踪多项式拟合。
x
这是我得到的情节:
我想知道的是多项式拟合的最高峰的确切坐标。
答案 0 :(得分:1)
此解决方案假定二次拟合(尽管可以更改),并且避免使用polyfit
只是为了显示替代方法。不声称这比其他方法更好。
1。拟合多项式
( a )这种方法使用fminsearch
来快速获得数值拟合。注意,这需要为多项式系数c0
找到一个合理的起点。
% MATLAB R2017a
x = [53, 62, 69, 71, 78, 89, 99, 106, 118, 133, 140, 151, 157, 164];
y = [211, 227, 233, 245, 262, 278, 283, 289, 282, 276, 268, 259, 252, 246];
fh=@(c) c(1) + c(2)*((x-c(3)).^2); % to pass to fminsearch
errh=@(c) sum((fh(c)-y).^2); % uses Least Sum of Squared Error
% err2h=@(c) sum(abs(fh(c)-y)); % sum of absolute error
qh=@(X,c) c(1) + c(2)*((X-c(3)).^2); % for plotting
c0 = [300 -0.07 100]; % initial guess at coefficients
[c, SSE] = fminsearch(errh,[300 -0.1 100])
( b )此步骤可用的其他方法包括使用polyfit
(see here)。其他methods选项也可以。
2。寻找最大纵坐标
( a )使用基本演算来找到最大值。如果知道多项式的形式,则取一阶导数(dy / dx)&设置为零。解决x。如果是二阶导数,如果是负数,则具有局部最大值。这可以通过分析来实现。
( b )通过数字找到该坐标达到一定的公差。
xstep = 0.01;
Xrng = min(x)-10:.01:max(x)+10;
figure, hold on
plot(x,y,'ko')
xlim([0 180])
ylim([0 300])
plot(Xrng,ones(size(Xrng))*c(1),'r-')
plot(Xrng,qh(Xrng,c),'b--')
[y_max,ind] = max(qh(Xrng,c));
x_max = Xrng(ind);
disp(['Maximum occurs at (' num2str(x_max) ', ' num2str(y_max) ')'])
最大值出现在(115.75,285.4542)
( c )您也可以从信号处理工具箱使用findpeaks
。
[y_max,locs] = findpeaks(qh(Xrng,c))
x_max = Xrng(locs)
扩展名: 尽管未显示,但可以(1)强制拟合多项式的最大值与数据中的最大值相同(作为y值或(x,y)坐标),或(2)权重您想要更紧密适合的数据。