如何在Lua中进行代数学?

我已经寻找并尝试过了,但我找不到真正有用的信息,所以在此提前谢谢您。

我的问题是我有一个变化的变量"balance",目前我将其表示为200。我需要使用这个方程式来找出在游戏中应该提取多少钱,但我不知道如何编写解决代数问题的LUA脚本

方程式是: 200/(x+x^2+x^3+x^4+x^5)=0.00001001 如何解决x的问题?

我已经尝试在200/(x+x^2+x^3+x^4+x^5)不等于0.00001001时添加.0000001,但这非常不切实际,而且我没有使其工作。这是我目前能想到的唯一方法。任何帮助都将不胜感激。

点赞
用户240457
用户240457
`200/(x+x^2+x^3+x^4+x^5)=0.00001001` 等价于 `200 = 0.00001001 * (x+x^2+x^3+x^4+x^5)`,因此你需要解决一个多项式方程,通常人们喜欢处理这种形式的方程。

如果你想使用 Lua,那么如果方程的形式足够可预测,你可以找到一个右侧始终小于左侧的地方(例如 x = 0),以及一个右侧始终大于左侧的地方(例如x的非常大的值),然后可以使用二分查找-虽然效率不高,但是确定性高且易于编码。

对于一般的多项式方程,一个众所周知的方法是 [https://en.wikipedia.org/wiki/Newton](https://en.wikipedia.org/wiki/Newton) 的方法。给定 f(x)= 0 和 x 的猜测,更好的猜测可能是 x - f(x)/ f'(x),其中 f'(x)是 f(x)的导数。但是,有一些病态情况无法进行有效解决,因此您可能需要确认您的方程可靠可处理。

由于您有 Lua,因此您可以引入调用数学库(例如 [http://commons.apache.org/proper/commons-math/](http://commons.apache.org/proper/commons-math/) 的代码)的 C 代码。它们有一个名为 LaguerreSolver() 的例程可以合理可靠地为您解决多项式方程,来防止所有病态情况。大多数数学库包含的工作比任何单个人处理单个问题所能加入的工作都要多,并且具有相应的比自己解决的方法更高的质量。
2017-05-12 04:22:02
用户1847592
用户1847592

这个解决方案可以找到任何连续函数的零点(不仅仅是代数函数,也不仅仅是可导函数),需要知道要找到的根的区间。

local function find_zero(f, x_left, x_right, eps)
   eps = eps or 0.0000000001   -- 精度
   local f_left, f_right = f(x_left), f(x_right)
   assert(x_left <= x_right and f_left * f_right <= 0, "区间错误")
   while x_right - x_left > eps do
      local x_middle = (x_left + x_right) / 2
      local f_middle = f(x_middle)
      if f_middle * f_left > 0 then
         x_left, f_left = x_middle, f_middle
      else
         x_right, f_right = x_middle, f_middle
      end
   end
   return (x_left + x_right) / 2
end

local function my_func(x)
   return 200/(x+x^2+x^3+x^4+x^5) - 0.00001001
end

-- 假设根在1和1000之间
local x = find_zero(my_func, 1.0, 1000.0)
print(x)       -->  28.643931367544
2017-05-12 09:49:07