Python 对数函数

3 投票
3 回答
9533 浏览
提问于 2025-04-18 07:24

我在找一个关于在Python中使用对数的例子。我试过用 sympynumpy,但还是没能实现我想要的效果。比如,对于这样的输入:

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

这不是你想要的吗?

撰写回答