我正在寻找一个能够提供包含对数或指数的实数公式模型的求解器。
cvc4可以处理包含实数的对数或指数的函数吗?同样,cvc4可以表示常量e
吗?
根据this question,z3只能处理常数指数,这对我没有帮助。
This question只询问整数的对数。
答案 0 :(得分:1)
我对cvc4不熟悉,但我可能有一些关于对数的有用属性,你可以根据自己的限制来利用这些属性。
从技术上讲,没有计算机(无论多么强大)知道e
是什么,因为它是超越的(不能表示为具有有理系数的多项式方程的解)。
如果限制为只能取整数的对数,则可以将e
表示为一个近似值并以此方式求解。公式最终比直接取对数更长,但优点是你可以有效地计算基数是任意有理数的对数,而只能单独找到整数的对数。
让e
与a/b
和a
为整数的分数b
近似。
(a/b)^n = x
log(base a/b)(x) = n
这并没有真正让你到任何地方,所以我们必须走一条需要更多代数的不同路线。
(a/b)^n = x
(a^n)/(b^n) = x
a^n = x * b^n
log(base a)(x * b^n) = n
log(base a)(x) + log(base a)(b^n) = n
log(base a)(x) + n*log(base a)(b) = n
log(base a)(x) = n - n*log(base a)(b)
log(base a)(x) = n * (1 - log(base a)(b))
n = log(base a)(x) / (1 - log(base a)(b))
换句话说,log(base a)(x) / (1 - log(base a)(b))
是ln(x)
的近似值,其中a/b
是e
的近似值。显然,ln(x)
的近似值更接近ln(x)
的实际值,因为a/b
更接近e
。请注意,我在此处保留了一般信息,a/b
可以表示任何有理数,而不只是e
。
如果这并没有完全回答你的问题,我希望它至少有帮助。
刚试了一个任意的例子。
如果您分别将a
和b
视为27183
和10000
,我尝试了这个快速计算:
log(base 27183)(82834) / (1 - log(base 27138)(10000)) = 11.32452...
ln(82834) = 11.32459...