我正在寻找一个在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)这样的其他函数来完成这个任务。
有没有什么方法或地方(文档或类似的)可以找到如何做到这一点?
发布于 2014-05-23 17:15:10
我可能误解了你需要做的事,因为你说你已经试过同情了。但是,看起来你只是想用代数方程来解x。
解方程中的x
log(x+1)+log(4-x)=log(100)使用同情将是
>>> 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这不是你要找的吗?
发布于 2014-05-23 15:25:37
因为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发布于 2014-05-23 19:49:26
已经给出了好的建议。我只是注意到,您也可以在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]因此,在Eq形式下,解是自动验证的。这并不总是正确的,但是可以使用数值计算来检查值:
>>> 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
0https://stackoverflow.com/questions/23832864
复制相似问题