對于背景關系,讓我首先定義一些東西。對于給定的自然數 n,設 theta 和 eta 是長度為 n 的兩個正向量,而 epsilon 也是長度為 n 的 -1 和 1s 的向量。
我正在嘗試實作一種演算法,該演算法計算具有 g_n=0 的實函式 g=(g_1,...g_n) 的有限序列,該演算法驗證以下遞回關系:
g_(i-1)(x)=f_i(x) 如果 x*epsilon_i > x_star * epsilon_i 否則為 0,
f_i(x)=2eta_i*(x-theta_i) g_i(x) 和 x_star 是 f_i 的零(我說的是“零”,因為 f_i 應該是一個遞增的連續分段仿射函式)。
下面是我的嘗試。在下面的代碼中,computing_zero 是一個輔助函式,它允許我計算 x_star,即 f 的零,假設我知道它的斷點。
def computing_g(theta,epsilon,eta):
n=len(theta)
g=[lambda x:0,lambda x:2*eta[n-1]*max(0,x-theta[n-1])] # initialization of g : g=[g_n,g_(n-1)]
breakpoints_of_f=[theta[n-1]]
for i in range(1,n):
f= lambda x:2*eta[n-1-i]*(x-theta[n-1-i]) g[i](x)
x_star=computing_zero(breakpoints_of_f,f)
breakpoints_of_f.append(x_star)
g.append(lambda x: f(x) if epsilon[n-1-i]*x > epsilon[n-1-i]*x_star else 0)
return(breakpoints_of_f,g)
每當我運行演算法時,我都會收到以下錯誤:
line 6, in <lambda>
f= lambda x:2*eta[n-1-i]*(x-theta[n-1-i]) g[i](x)
line 9, in <lambda>
g.append(lambda x: f(x) if epsilon[n-1-i]*x > epsilon[n-1-i]*x_star else 0)
RecursionError: maximum recursion depth exceeded in comparison
我想某處有某種無限回圈,但我無法確定在哪里。
uj5u.com熱心網友回復:
我試著用閉包寫這個,但我無法驗證數學結果是否符合你的預期,因為你沒有為計算零的函式提供代碼,所以我只是編造了一些東西。我很確定這應該避免您看到的遞回問題。我所做的另一個更改是,我沒有使用[n-1-i]回圈中的所有索引,而是將回圈更改為從 2 開始,然后每個索引檢查都只是[-i]. 例外是在串列 g 中查找用于計算生成函式 f 的函式時。那里的索引現在[i-1]而不是[i].
def get_func_f(eta, theta, i, g):
"""Generate function f(x)"""
eta_i = eta[-i]
theta_i = theta[-i]
g_i = g[i-1] # This is the one index working from left to right, and i will always be len(g) 1
def f(x):
return 2 * eta_i * (x - theta_i) g_i(x)
return f
def get_func_g(f, epsilon_i, x_star):
"""generate function g(x)"""
def g(x):
if epsilon_i * x > epsilon_i * x_star:
return f(x)
else:
return 0
return g
def computing_g(theta,epsilon,eta):
n=len(theta)
g=[lambda x:0,lambda x:2*eta[-1]*max(0,x-theta[-1])] # initialization of g : g=[g_n,g_(n-1)]
breakpoints_of_f=[theta[-1]]
for i in range(2,n): # Start at 2 and just use [-i] instead of [n-1-i] everywhere.
f = get_func_f(eta, theta, i, g)
x_star=computing_zero(breakpoints_of_f,f)
breakpoints_of_f.append(x_star)
g.append(get_func_g(f, epsilon[-i], x_star))
#print(f"{breakpoints_of_f=}\n{g}")
return(breakpoints_of_f,g)
def computing_zero(a, b):
"""Completely made up as example code wasn't provided."""
return -(a[-1] b(a[-1]))
answer = computing_g(theta=[0.5,0.3,0.2,0.1],epsilon=[1,-1,1,-1],eta=[1,3,2,4])
print(f"breakpoints: {answer[0]}\ng={answer[1]}")
輸出:
breakpoints: [0.1, 0.30000000000000004, -0.3000000000000004]
g=[<function computing_g.<locals>.<lambda> at 0x0000023F329CB670>, <function computing_g.<locals>.<lambda> at 0x0000023F329CB700>, <function get_func_g.<locals>.g at 0x0000023F329CB820>, <function get_func_g.<locals>.g at 0x0000023F329CB940>]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/490547.html
