如何在 Lua 中完成代数?
How does one do Algebra in 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 但这非常不切实际,我还没有得到它上班。这是我目前唯一能想到的方法。任何帮助将不胜感激。
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. Given f(x) = 0 and a guess for x, a better guess might be x - f(x) / f'(x),其中 f'(x) 是 f(x) 的导数。但是,在一些病态案例中,由于各种原因失败了,所以您可能再次想知道您的方程是否可靠易处理。
因为你有 Lua,你可以引入调用数学库的 C 代码,例如 http://commons.apache.org/proper/commons-math/。他们有一个名为 LaguerreSolver() 的例程,它将相当可靠地为您求解多项式方程,从而抵御所有病态情况。大多数数学库包含的工作量比任何一个人可能为单个问题所做的工作量都要多,而且质量也相应地比我上面描述的自己动手的方法更高。
这个解决方案找到任何连续函数的零(不仅是代数的而且不仅是可微的)并且需要知道要找到的根的重氮区。
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
我已经看过并尝试过,但我找不到任何真正有用的东西,所以提前谢谢你。
我的问题是我有一个变化的变量,"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 但这非常不切实际,我还没有得到它上班。这是我目前唯一能想到的方法。任何帮助将不胜感激。
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. Given f(x) = 0 and a guess for x, a better guess might be x - f(x) / f'(x),其中 f'(x) 是 f(x) 的导数。但是,在一些病态案例中,由于各种原因失败了,所以您可能再次想知道您的方程是否可靠易处理。
因为你有 Lua,你可以引入调用数学库的 C 代码,例如 http://commons.apache.org/proper/commons-math/。他们有一个名为 LaguerreSolver() 的例程,它将相当可靠地为您求解多项式方程,从而抵御所有病态情况。大多数数学库包含的工作量比任何一个人可能为单个问题所做的工作量都要多,而且质量也相应地比我上面描述的自己动手的方法更高。
这个解决方案找到任何连续函数的零(不仅是代数的而且不仅是可微的)并且需要知道要找到的根的重氮区。
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