手机改了分辨率后有误差用公式计算加减

28

主题

184

回帖

581

积分

管理员

积分
581
手机改了分辨率后有误差用公式计算加减




  1. function calculateFunction(inputValue) {
  2.     function leastSquaresFit(x, y) {
  3.         var n = x.length;
  4.         var sumX = 0;
  5.         var sumY = 0;
  6.         var sumXY = 0;
  7.         var sumX2 = 0;

  8.         for (var i = 0; i < n; i++) {
  9.             sumX += x[i];
  10.             sumY += y[i];
  11.             sumXY += x[i] * y[i];
  12.             sumX2 += x[i] * x[i];
  13.         }

  14.         var denominator = (n * sumX2 - sumX * sumX);
  15.         if (denominator === 0) {
  16.             return [0, 0]; // 避免除以零
  17.         }

  18.         var a = (n * sumXY - sumX * sumY) / denominator;
  19.         var b = (sumY - a * sumX) / n;

  20.         return [a, b];
  21.     }

  22.     function linearFunction(x, a, b) {
  23.         return a * x + b;
  24.     }

  25.     function clipValue(value, maxValue) {
  26.         return Math.min(value, maxValue);
  27.     }

  28.     var x = [94, 155, 233, 405, 591, 766, 844, 930, 208];
  29.     var y = [0, 65, 157, 380, 580, 810, 916, 1021, 140];
  30.     var maxValue = 1080;

  31.     // 进行线性拟合,得到线性函数的系数 a 和 b
  32.     var coefficients = leastSquaresFit(x, y);
  33.     var a = coefficients[0];
  34.     var b = coefficients[1];

  35.     if (typeof inputValue === 'number') {
  36.         // 输入为 x 值,计算 y 值
  37.         var predictedY = linearFunction(inputValue, a, b);
  38.         // 对预测结果进行裁剪,确保不超过 1080
  39.         predictedY = clipValue(predictedY, maxValue);
  40.         return predictedY;
  41.     } else if (typeof inputValue === 'number' && inputValue >= 0 && inputValue <= maxValue) {
  42.         // 输入为 y 值,计算 x 值
  43.         if (a === 0) {
  44.             // 当 a 为 0 时,若 b 等于输入的 y 值,x 可以是任意值;否则,无解
  45.             if (b === inputValue) {
  46.                 return null;
  47.             } else {
  48.                 return NaN;
  49.             }
  50.         }
  51.         var predictedX = (inputValue - b) / a;
  52.         return predictedX;
  53.     } else {
  54.         throw new Error('输入不合法,请输入一个数字且范围在 0 到 ' + maxValue + ' 之间');
  55.     }
  56. }

  57. // 调用函数进行正向计算(根据 x 计算 y)
  58. var result1 = calculateFunction(100);
  59. console.log("当 x = 550 时,计算得到的 y 值为: " + result1);

  60. // 调用函数进行反向计算(根据 y 计算 x)
  61. var result2 = calculateFunction(1);
  62. console.log("当 y = 0 时,计算得到的 x 值为: " + result2);
复制代码


举报 回复