私は、任意の関数を取り、関数に入れると0に近い(イプシロンに近い)答えを返すパラメータを返すことができる関数を作成しようとしています。関数は次のようになります。
def solve(f, x0=-10000, x1=10000, epsilon=EPSILON):
x0、x1 は、答えを探す範囲です。私が知っているもう1つのことは、正と負の両方になる可能性のある関数にのみ適用されることです(たとえば、f(X)= x ^ 2 + 1は解決するのに適した関数ではありません)。
ここで答えを見つけました二分法
def solve(f, x0=-10000, x1=10000, epsilon=EPSILON):
""" return the solution to f in the range between x0 and x1\
use an algorithm to check if a solution can be found so f(x)<epsilon
iterates in a while loop until either a solution is found or if the abs
the value of the midpoint is smaller than epsilon (return None)"""
# make sure the function is in the type that can be solved
if (f(x1) * f(x0)) >= 0:
return None
while True:
mid = (x0 + x1) / 2
sol = f(mid)
if abs(sol) < epsilon:
return mid
if mid == 0 or (abs(f(x1) - f(x0)) / 2) < epsilon:
return None
elif sol * f(x0) < 0:
x1 = mid
elif sol * f(x1) < 0:
x0 = mid
編集: これまでのところとても良いです。これで、書く必要のある主な関数ができました。これは、関数に尊敬される値を与える関数です。関数自体は、逆にする必要がある関数と、答えが近いと思われるイプシロンを取得します。
たとえば、f(x) = x+2 の場合、inverse_func(f(100))が 100 を返すようにします。ヒントは、前に示した関数を使用できるということです。私はこのようにしてみました:
def inverse(g, epsilon=EPSILON):
"""return f s.t. f(g(x)) = x"""
def ret_function(x):
return find_x(x, g, epsilon)
return ret_function
def find_x(x, g, epsilon):
x0, x1 = -10000, 1001
g_sol = x
sent_epsilone = EPSILON
while True:
def f(x):
g_val = g(x)
ans = g_sol - g_val
return ans
sol = solve(f, x0, x1, sent_epsilone)
if sol == None:
pass
else:
return sol
x0, x1 = x0 * 10, x1 * 10
問題を解決するために「解決」機能を与えようとしたこと。f(x) から与えられた値から、解法関数が見つける必要がある値を引いた値を計算する関数を与えています。
たとえば、f(x) = x+2 の場合、次の呼び出し
Minus_func = inverse(g(100)) =inverse(102) print(minus_func) は返すことがサポートされています
100 は、"solve" 内の関数が 102-f(x) であり、もちろん "solve" がこれに対する正しい値を見つけることができるためです。
コードでこれを試してみましたが、うまく機能しますが、十分ではありません。一部の機能では、正常に動作します。しかし、他の人にとっては、まったく機能しません。関数の場合:
math.e**x
x**-3
おそらく他の人も、うまくいきません。誰かがこれを解決する方法を知っていますか?.
ps - コードを python で書いているので、答えも python にあるといいですね。しかし、それ以外は大丈夫です(私はJavaも知っています。もちろん、ロジックを説明するものは何でも素晴らしいです)
ありがとう!