Python 对数函数
我在找一个关于在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)
。
有没有什么方法或者地方(比如文档之类的)可以让我找到如何做到这一点的信息?
3 个回答
1
因为 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
1
已经有很好的建议了。我只是想提一下,你也可以在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
9
我可能误解了你的需求,因为你提到你已经尝试过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
这不是你想要的吗?