【问题标题】:How does one do Algebra in Lua?Lua中的代数是怎么做的?
【发布时间】:2017-05-12 03:26:54
【问题描述】:

我已经查看并尝试过,但我找不到任何真正有用的东西,所以提前谢谢你。

我的问题是我有一个不断变化的变量,“余额”,目前我将它表示为 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,但这是非常不切实际的,我还没有让它工作.这是我目前能想到的唯一方法。任何帮助将不胜感激。

【问题讨论】:

  • 你必须实现自己的算法来解决它。
  • “如果 200/(x+x^2+x^3+x^4+x^5) 不等于 0.00001001,则添加 .0000001”?没有别的办法吗?
  • 为什么我对这个问题投了反对票?

标签: algorithm lua algebra


【解决方案1】:

此解决方案找到任何连续函数的零(不仅是代数的而且不仅是可微的),并且需要知道要找到的根的二氮杂腙。

local function find_zero(f, x_left, x_right, eps)
   eps = eps or 0.0000000001   -- precision
   local f_left, f_right = f(x_left), f(x_right)
   assert(x_left <= x_right and f_left * f_right <= 0, "Wrong diapazone")
   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

-- Assuming that the root is between 1 and 1000
local x = find_zero(my_func, 1.0, 1000.0)
print(x)       -->  28.643931367544

【讨论】:

  • id 给你一个赞成票,但我还没有足够的代表。非常感谢
【解决方案2】:

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's_method。给定 f(x) = 0 和对 x 的猜测,更好的猜测可能是 x - f(x) / f'(x),其中 f'(x) 是 f(x) 的导数。不过,在一些病态的情况下,由于各种原因,这会失败,所以您可能想再次知道您的方程式是否可靠。

由于您拥有 Lua,您可能能够引入调用数学库(如 http://commons.apache.org/proper/commons-math/)的 C 代码。他们有一个名为 LaguerreSolver() 的例程,它可以为您合理可靠地求解多项式方程,保护自己免受所有病理情况的影响。大多数数学库包含的工作量比任何一个人可能为单个问题投入的工作量要多得多,并且相应地比我上面描述的自己做的方法质量更高。

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多