|
手机改了分辨率后有误差用公式计算加减
- function calculateFunction(inputValue) {
- function leastSquaresFit(x, y) {
- var n = x.length;
- var sumX = 0;
- var sumY = 0;
- var sumXY = 0;
- var sumX2 = 0;
- for (var i = 0; i < n; i++) {
- sumX += x[i];
- sumY += y[i];
- sumXY += x[i] * y[i];
- sumX2 += x[i] * x[i];
- }
- var denominator = (n * sumX2 - sumX * sumX);
- if (denominator === 0) {
- return [0, 0]; // 避免除以零
- }
- var a = (n * sumXY - sumX * sumY) / denominator;
- var b = (sumY - a * sumX) / n;
- return [a, b];
- }
- function linearFunction(x, a, b) {
- return a * x + b;
- }
- function clipValue(value, maxValue) {
- return Math.min(value, maxValue);
- }
- var x = [94, 155, 233, 405, 591, 766, 844, 930, 208];
- var y = [0, 65, 157, 380, 580, 810, 916, 1021, 140];
- var maxValue = 1080;
- // 进行线性拟合,得到线性函数的系数 a 和 b
- var coefficients = leastSquaresFit(x, y);
- var a = coefficients[0];
- var b = coefficients[1];
- if (typeof inputValue === 'number') {
- // 输入为 x 值,计算 y 值
- var predictedY = linearFunction(inputValue, a, b);
- // 对预测结果进行裁剪,确保不超过 1080
- predictedY = clipValue(predictedY, maxValue);
- return predictedY;
- } else if (typeof inputValue === 'number' && inputValue >= 0 && inputValue <= maxValue) {
- // 输入为 y 值,计算 x 值
- if (a === 0) {
- // 当 a 为 0 时,若 b 等于输入的 y 值,x 可以是任意值;否则,无解
- if (b === inputValue) {
- return null;
- } else {
- return NaN;
- }
- }
- var predictedX = (inputValue - b) / a;
- return predictedX;
- } else {
- throw new Error('输入不合法,请输入一个数字且范围在 0 到 ' + maxValue + ' 之间');
- }
- }
- // 调用函数进行正向计算(根据 x 计算 y)
- var result1 = calculateFunction(100);
- console.log("当 x = 550 时,计算得到的 y 值为: " + result1);
- // 调用函数进行反向计算(根据 y 计算 x)
- var result2 = calculateFunction(1);
- console.log("当 y = 0 时,计算得到的 x 值为: " + result2);
复制代码
|
|