Логарифмическая функция 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).

Есть ли какой-то метод или где-то (документация или подобное), где я могу найти, как это сделать?


person Nexus Blade    schedule 23.05.2014    source источник
comment
Это займет меньше времени, чтобы решить вручную, чем в Python. Или, по крайней мере, проще многое упростить, прежде чем передать это Python.   -  person cdhagmann    schedule 23.05.2014
comment
Вы имеете в виду, что хотите автоматически решить уравнение, которое вы определили? Вы читали это?   -  person jonrsharpe    schedule 23.05.2014
comment
Делайте это только программно, если вы не можете сделать это математически. В чем заключается ваша настоящая проблема?   -  person Henry Gomersall    schedule 23.05.2014
comment
log и возведение в степень являются обратными функциями. Когда у вас есть что-то вроде 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, что является просто квадратным уравнением, которое легко решить. Убедитесь, что вы не можете просто использовать упрощающее математическое преобразование для своей задачи, прежде чем вы начнете использовать тяжелые методы численного решения.   -  person shuttle87    schedule 23.05.2014
comment
@cdhagmann нет, не будет.   -  person asmeurer    schedule 24.05.2014
comment
Я не понимаю, почему есть близкие голоса по этому вопросу. Комментаторы, похоже, считают, что вам следует избегать использования компьютеров для выполнения действий, которые вы можете сделать вручную, поэтому, пожалуйста, отвечайте обычной почтой.   -  person asmeurer    schedule 24.05.2014
comment
@asmeurer нет, комментаторы считают, что вы должны использовать правильный инструмент для работы - неясно, что компьютеры здесь являются правильным инструментом (по крайней мере, с учетом плохого описания вопроса)   -  person Henry Gomersall    schedule 26.05.2014
comment
Может быть, так и покажется, если вы не знакомы с системами компьютерной алгебры. Но ответы должны дать понять, что компьютеры — отличный инструмент для этой работы.   -  person asmeurer    schedule 26.05.2014


Ответы (3)


Я могу неправильно понять, что вам нужно сделать, потому что вы сказали, что уже пробовали 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

Разве это не то, что вы ищете?

person mjandrews    schedule 23.05.2014

Поскольку 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
person cdhagmann    schedule 23.05.2014
comment
Дайте больше комментариев о том, что вы делаете. Это просто будет способствовать копированию и вставке без понимания. - person rayryeng; 23.05.2014
comment
@rayryeng, судя по вопросу, это все, что они хотят. Но я в процессе редактирования. - person cdhagmann; 23.05.2014

Хороший совет уже дали. Отмечу лишь, что вы также можете проверить ответ в 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
person smichr    schedule 23.05.2014