指数方程式を解く

How to solve an exponential equation in Python – StackOverflow

"""
from sympy import *
init_printing()
x, y, z, t = symbols('x y z t')
k, m, n = symbols('k m n', integer=True)
f, g, h = symbols('f g h', cls=Function)
"""

a, b, c = symbols('a b c')
f = Eq(exp(x * a) - exp(x * b), c)
f

 

e^{a x} - e^{b x} = c

 

任意のa, b, cに於けるx(1変数)を求解するというのであれば,
scipy.optimize.minimize_scalarで数値的に求めるのが一番.
(目的関数の二乗が最小化される様なxを求解)
 

import numpy as np
from scipy.optimize import minimize_scalar


def func(x, *args):
    return (np.exp(x * a) - np.exp(x * b) - c)**2


a, b, c = 3, 2, 1
res = minimize_scalar(func, args=(a, b, c,))
print(res.x)
print(res.fun)

 

0.382245085908
1.21435463189e-19
 

a, b, c = 5, 2, -1
res = minimize_scalar(func, args=(a, b, c,))
print(res.x)
print(res.fun)

-0.305430244172
0.454639879178
 

Sympyを使って考えると(解析解).
同様に,(a, b, c) = (3, 2, 1), (5, 2, -1)を考える.

solve(f.subs([(a, 3), (b, 2), (c, 1)]))

 

\left [ \log{\left (\frac{1}{3} + \left(- \frac{1}{2} - \frac{\sqrt{3} i}{2}\right) \sqrt[3]{\frac{\sqrt{93}}{18} + \frac{29}{54}} + \frac{1}{9 \left(- \frac{1}{2} - \frac{\sqrt{3} i}{2}\right) \sqrt[3]{\frac{\sqrt{93}}{18} + \frac{29}{54}}} \right )}, \\ \quad \log{\left (\frac{1}{3} + \frac{1}{9 \left(- \frac{1}{2} + \frac{\sqrt{3} i}{2}\right) \sqrt[3]{\frac{\sqrt{93}}{18} + \frac{29}{54}}} + \left(- \frac{1}{2} + \frac{\sqrt{3} i}{2}\right) \sqrt[3]{\frac{\sqrt{93}}{18} + \frac{29}{54}} \right )}, \\ \quad \log{\left (\frac{1}{9 \sqrt[3]{\frac{\sqrt{93}}{18} + \frac{29}{54}}} + \frac{1}{3} + \sqrt[3]{\frac{\sqrt{93}}{18} + \frac{29}{54}} \right )}\right ]

 

訳が分からないので,数値近似を得る.
 

[N(res) for res in solve(f.subs([(a, 3), (b, 2), (c, 1)]))]

 

\left [ -0.191122542920018 - 1.8564785414713 i, \\ \quad -0.191122542920018 + 1.8564785414713 i, \\ \quad 0.382245085840036\right ]

 
 

 
同様に,
 

solve(f.subs([(a, 5), (b, 2), (c, -1)]))

 

\left [ \log{\left (- {CRootOf} {\left(e^{5 x} - e^{2 x} + 1, 0\right)} \right )} + i \pi, \\  \quad \log{\left ({CRootOf} {\left(e^{5 x} - e^{2 x} + 1, 1\right)} \right )}, \\  \quad \log{\left ({CRootOf} {\left(e^{5 x} - e^{2 x} + 1, 2\right)} \right )}, \\  \quad \log{\left ({CRootOf} {\left(e^{5 x} - e^{2 x} + 1, 3\right)} \right )}, \\  \quad \log{\left ({CRootOf} {\left(e^{5 x} - e^{2 x} + 1, 4\right)} \right )}\right ]

 

[N(res) for res in solve(f.subs([(a, 5), (b, 2), (c, -1)]))]

 

\left [ -0.212289420497203 + 3.14159265358979 i, \\  \quad 0.155283921568404 - 1.98018090467209 i, \\  \quad 0.155283921568404 + 1.98018090467209 i, \\  \quad -0.0491392113198024 - 0.420070913441994 i, \\  \quad -0.0491392113198024 + 0.420070913441994 i\right ]

 
 
 
 
 
改行……(´・ω・`)

広告
カテゴリー: 未分類 パーマリンク

指数方程式を解く への2件のフィードバック

  1. ピンバック: scipy.optimize.minimize | 粉末@それは風のように (日記)

  2. ピンバック: メモ | 粉末@それは風のように (日記)

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中