Javascript-获取计算机方程的最小整数解

Javascript-获取计算机方程的最小整数解,javascript,math,Javascript,Math,我在编程中试图解一个方程时遇到了一个问题 假设我有一行代码: Math.round(((x / 5) + Math.pow(x / 25, 1.3)) / 10) * 10; 给定x=1000,结果为320 现在,在给定结果的情况下,我如何解这个方程 假设给定结果320,我想得到解析该行代码的x的最小整数值 /*320 =*/ Math.round(((x / 5) + Math.pow(x / 25, 1.3)) / 10) * 10; 因为数学课,我有点困难。即使表达式是一个线性方程,M

我在编程中试图解一个方程时遇到了一个问题

假设我有一行代码:

Math.round(((x / 5) + Math.pow(x / 25, 1.3)) / 10) * 10;
给定x=1000,结果为320

现在,在给定结果的情况下,我如何解这个方程

假设给定结果320,我想得到解析该行代码的x的最小整数值

/*320 =*/ Math.round(((x / 5) + Math.pow(x / 25, 1.3)) / 10) * 10;
因为数学课,我有点困难。即使表达式是一个线性方程,Math.Round也比x的解多,所以我希望我的解是最小值整数值

注意x是一个整数,如果我设置x=999,结果仍然是320。


如果我继续降低x,我可以看到984(至少在Chrome 64.0.3282.186中)是这种情况下的正确答案,因为在表达式/编程行中,x的最小值等于320。

用Math.round解方程只引入了边界条件

如果:

然后:

Math.round(((x / 5) + Math.pow(x / 25, 1.3)) / 10)  = 32
两边都除以10。现在你有:

Math.round(expression) = 32
可表示为不平等陈述:

31.5 < expression < 32.4999..

为x求解这两个问题将为您提供x的有效值范围。这就是我不打算做的代数:)

我想最可靠的工作方式(尽管有点幼稚)是遍历所有有效数字并检查谓词

function getMinimumIntegerSolution(func, expectedResult){
  for(let i = 0 /*Or Number.MIN_SAFE_INTEGER for -ves*/; i< Number.MAX_SAFE_INTEGER ; i++ ) { 
    if(func(i) === expectedResult)
        return i;
  }
}

这将返回您所期望的984,因为

f(n) = Math.round(((x / 5) + Math.pow(x / 25, 1.3)) / 10) * 10
如果是单调的(在本例中是递增的),可以进行二进制搜索。 请注意,我最初是用Java编写以下代码的,在Javascript中它的语法不正确,但希望能够直接翻译成后者

var x0 = 0;
var x1 = 1e6;
var Y = 320d;
var epsilon = 10d;

var x = (x1 - x0) / 2d;
var y = 0;

while (Math.abs(Y - (y = f(x))) > epsilon) {
   if (y > Y) {
      x = (x - x0) / 2d;
   } else {
      x = (x1 - x) / 2d;
   }
   // System.out.println(y + " " + x);
}

while (f(x) < Y)
   ++x;

// System.out.println(Math.round(x) + " " + f(x));
  • 请注意,最后一个递增的循环
    x
    保证在小于
    epsilon
    的步骤中完成
  • 可以调整
    x0
    x1
    epsilon
    的值,以便为您的问题提供更好的边界
  • 如果
    epsilon
    的值“太小”,则该算法将失败,因为在
    f
    中发生舍入
  • 这个解决方案的复杂性是
    O(log2(x1-x0))

除了@webnetweaver-answer。如果你重新排列最后的方程,你会得到一个高阶多项式(13次),这是很难用代数方法求解的。您可以使用数值方法。对于JavaScript中的数值方法,可以使用。您还需要只求解下限(31.5)才能找到最低整数x,因为函数是单调递增的。另请参见JavaScript中的数值方程求解

这是一个使用牛顿法的解。它使用0作为初始猜测。得到最小整数解只需要五次迭代。
var结果=320;
var d=结果-5;
函数func(x){
返回x/5+0.0152292*数学功率(x,1.3)-d;
}
函数deriv(x){
返回0.2+0.019798*数学功率(x,0.3);
}
varε=0.001//终止条件
牛顿函数(猜想){
var近似值=猜测-函数(猜测)/deriv(猜测);
如果(数学绝对值(猜测-近似值)>ε){
log(“猜测:+Guess”);
返回牛顿(约);
}否则{
//最小整数的四舍五入解
返回数学单元(近似值);
}
}

log(“最小整数:+newton(0))括号在这两个代码片段中都是不平衡的。你知道这样一个事实:有时根据给定的输出很难计算出一些方程的输入,这正是密码学的基础。但是
984
低于
990
那么,990怎么可能是正确的答案呢?@JaromandaX我在C#中测试了这个函数,完全忘记了不同的编译器可能有不同的行为,比如解释浮点。有人能告诉我,不同的浏览器或计算机是否会有像这样的不同行为吗?“即使那个表达式是一个线性方程…”当然,所以你可以应用回归来解决它。一旦你算出了数学算法,然后尝试一个解决方案。如果你在这方面有问题,请再发一次,不要发数学题。我在发这个问题之前已经做过这种方法,但老实说,这似乎是一种“懒惰”的方法。然而,这是一个解决方案,而且很容易理解。谢谢。如果结果是32而不是320,这样行吗?如果将32除以10:
3.2=Math.round(表达式)
。那不是不可能吗?因为数学总是四舍五入到整数?是的,那是不可能的。Math.round(x)永远不能等于3.2,因此x没有解决方案。Exprove如果您认为我回答了您的问题,请将其标记为正确,以便我可以获得一些美味的堆栈溢出点:)
getMinimumIntegerSolution((x) => Math.round(((x / 5) + Math.pow(x / 25, 1.3)) / 10) * 10 , 320)
f(n) = Math.round(((x / 5) + Math.pow(x / 25, 1.3)) / 10) * 10
var x0 = 0;
var x1 = 1e6;
var Y = 320d;
var epsilon = 10d;

var x = (x1 - x0) / 2d;
var y = 0;

while (Math.abs(Y - (y = f(x))) > epsilon) {
   if (y > Y) {
      x = (x - x0) / 2d;
   } else {
      x = (x1 - x) / 2d;
   }
   // System.out.println(y + " " + x);
}

while (f(x) < Y)
   ++x;

// System.out.println(Math.round(x) + " " + f(x));
490250.0 250000.0
208490.0 125000.0
89370.0 62500.0
38640.0 31250.0
16870.0 15625.0
7440.0 7812.5
3310.0 3906.25
1490.0 1953.125
680.0 976.5625
984 320.0