我正在寻找一个Python中关于对数运算的例子。我已经尝试过sympy
和numpy
,但仍然无法实现我想要的效果。例如,对于这样的输入:
log(x+1)+log(4-x)=log(100) # it's just an example
输出应该给我x
的值。我需要用任何其他函数来做到这一点,比如log(x+1)=4
或log(x)-log(x+1)=log(x)
。
有没有某种方法或地方(文档或类似)可以找到如何做到这一点?
我可能误解了您需要做的事情,因为您已经尝试过sympy。然而,看起来您只是想解一个代数方程中的x。
在这个方程中解x:
log(x+1)+log(4-x)=log(100)
使用sympy将会是一个不错的选择。
>>> from sympy import Symbol, solve, log
>>> x = Symbol('x')
>>> solve(log(x+1) + log(4-x) - log(100), x)
[3/2 - 5*sqrt(15)*I/2, 3/2 + 5*sqrt(15)*I/2]
如果您想的话,可以使用numpy检查这两个解决方案是否正确。
>>> import numpy as np
>>> a = 3/2 - 5*np.sqrt(15)*1j/2
>>> b = 3/2 + 5*np.sqrt(15)*1j/2
>>> np.log(a + 1) + np.log(4-a)
(4.6051701859880918+0j)
>>> np.log(b + 1) + np.log(4-b)
(4.6051701859880918+0j)
>>> np.log(100)
4.6051701859880918
这不是你在寻找的吗?
由于log
是一个非线性函数,您需要使用非线性求解器,如scipy.optimize.fsolve
。它接受一个函数和一个猜测值,并以数组形式返回答案。出于简单起见,我将该函数定义为lambda
函数,因为我们不需要在此行之外使用它,但使用标准的def
方法创建函数也可以。后端的[0]
从数组中获取值,以返回仅为浮点数。
import scipy.optimize
import math
scipy.optimize.fsolve(lambda x: math.log(x+1) - 4, 5)[0] # 5 is guess value
>>> 53.598
# Check
math.exp(4) - 1
>>> 53.598
已经给出了好的建议。我只想指出,你也可以在SymPy中检查答案。
>>> L, R = log(x+1)+log(4-x), log(100)
>>> eq = Eq(L, R)
>>> eq
log(-x + 4) + log(x + 1) == log(100)
>>> sol = solve(eq)
>>> [eq.subs(x, i) for i in sol]
[True, True]
因此,在等式形式中,解决方案会自动验证。这并不总是正确的,但您可以使用数值评估来检查值:
>>> f = eq.lhs - eq.rhs; f
log(-x + 4) + log(x + 1) - log(100)
>>> f.subs(x, sol[0])
-log(100) + log(5/2 - 5*sqrt(15)*I/2) + log(5/2 + 5*sqrt(15)*I/2)
>>> _.n()
0.e-124 + 0.e-125*I
>>> f.subs(x, sol[0]).n(chop=True) # the small numbers can be chopped
0
log(x+1)+log(4-x)=log(100)
这样的问题时,你可以通过使用对数定律来解决这个问题。log(x+1) + log(x-4) = log((x+1)*(x-4))
然后log((x+1)*(x-4)) = log(100) => (x+1)*(x-4) = 100
这只是一个二次方程,很容易解决。在开始使用重量级数值解法技术之前,请确保您不能仅使用简化的数学变换来解决问题。 - shuttle87