У меня есть линейное уравнение в строковом формате, например, что-то вроде этого:
equation = "2 * x + 1 = 17"
как лучше всего решить уравнение для x
?
Я уверен, что есть несколько способов сделать это, но, по моему мнению, вы, возможно, можете использовать split(equation, '=')
, чтобы получить левую и правую части уравнений, а затем вы можете либо пройтись по элементам, чтобы найти x. Лично я бы реализовал что-то вроде: stackoverflow.com/questions/21038250/… ----------
да, дерево должно быть решением, но мне было интересно, не было ли у Джулии чего-то подобного встроенного или я могу как-то использовать Meta
Ну вот:
julia> using Roots
julia> f(x) = eval(Meta.parse("2 * $x + 1 - 17"))
f (generic function with 1 method)
julia> find_zero(f, 5)
8.0
(Спасибо моему другу Элиасу, я научился так решать такие задачи).
Это все еще, ИМО, шаг назад от MATLAB solve(str2sym('2 * x + 1 = 17)')
. В старых версиях это было еще проще, просто solve('2 * x + 1 = 17')
. Как бы я ни любил Джулию, мне все еще не хватает простоты Symbolic Math Toolbox MATLAB.
В качестве другого варианта, используя Symbolics.jl
:
julia> using Symbolics
julia> equation = "2 * x + 1 = 17"
"2 * x + 1 = 17"
julia> @variables x
1-element Vector{Num}:
x
julia> eqn = eval(Meta.parse(replace(equation, " = " => "~")))
1 + 2x ~ 17
julia> Symbolics.solve_for(eqn, x)
8.0
(не уверен, какие уравнения умеет решать символика)
Это лучше, чем другой ответ, по двум причинам; вам не нужно вручную изменять строковое выражение, и использование символа solve_for
здесь кажется более естественным. Я бы хотел, чтобы Symbolics
смог распознать это выражение в первую очередь.
@AboAmmar К сожалению, теперь он решает только линейные уравнения. Но поскольку символьная математика не ограничена, есть надежда, что этот метод улучшится с помощью Symbolics.jl.
Мой подход будет заключаться в поиске существующих пакетов: juliapackages.com/c/symbolic-computation Я не уверен, что это лучший подход или как объективно измерить, какой подход лучше.