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))
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