二维固定点的数值求解
Numerically solving for fixed points in 2D
我有以下四个功能
u_h = u_h(J_l, J_h)
u_l = u_l(J_l, J_h)
J_l = J_l(u_h, u_l)
J_h = J_h(u_h, u_l)
如果愿意,让 u = [u_l, u_h]
和 J = [J_l, J_h]
。然后可以通过两个向量值函数 u
, J
:
来定义前面方程定义的系统的静止状态
u_0 = [u_l_0, u_h_0]:
u_0 = u(J(u_0))
同样,我需要检查是否J(u(J_0)) = J
。
这是一个概念性问题,这些函数背后的代码并没有真正简化,因此值得拥有一个合理的工作示例。
这是我到目前为止所做的事情:
# create a grid for test-values u
u = np.linspace(0.0001, 0.3, 200)
GridUL, GridUH = np.meshgrid(u, u, indexing='ij')
# J = [JL, JH] would be what I called "J" previously
JL = JSteadyState(GridUL, GridUH, thisType='low')
JH = JSteadyState(GridUL, GridUH, thisType='high')
UL2, UH2 = uSteadyState(JL, Param), uSteadyState(JH, Param)
# check for fixed points in both variables
err = 1e-3
fixedPointL = abs(UL2-GridUL) < err
fixedPointH = abs(UH2-GridUH) < err
fixedPointH & fixedPointH
如何有效地 我检查 UL2
、UH2
与 GridUL
、GridUH
以找到 定点(复数)?
到目前为止,我的方法在很大程度上取决于试错法和网格大小。 scipy.optimize.root
似乎专注于简单的根而不是更复杂的不动点问题。我可以将不动点问题写成根问题,但我想这会非常低效。我应该如何处理这个问题?
您可以尝试使用 scipy.optimize.fixed_point:
import scipy.optimize as optimize
def func(x):
x0, x1 = x
# J = [JL, JH] would be what I called "J" previously
JL = JSteadyState(x0, x1, thisType='low')
JH = JSteadyState(x0, x1, thisType='high')
UL2 = uSteadyState(JL, Param)
UH2 = uSteadyState(JH, Param)
return np.array([UL2, UH2])
err = 1e-3
guess = [0.1, 0.1]
fixedPointL, fixedPointH = optimize.fixed_point(func, guess, xtol=err)
但是请注意,这不会将 x
和 y
限制在域 (0.0001,
0.3)
内,因此这可能会或可能不会找到固定点,具体取决于诸如
你的函数 JSteadyState
和 uSteadyState
的平滑度和你的
初步猜测。
我有以下四个功能
u_h = u_h(J_l, J_h)
u_l = u_l(J_l, J_h)
J_l = J_l(u_h, u_l)
J_h = J_h(u_h, u_l)
如果愿意,让 u = [u_l, u_h]
和 J = [J_l, J_h]
。然后可以通过两个向量值函数 u
, J
:
u_0 = [u_l_0, u_h_0]:
u_0 = u(J(u_0))
同样,我需要检查是否J(u(J_0)) = J
。
这是一个概念性问题,这些函数背后的代码并没有真正简化,因此值得拥有一个合理的工作示例。
这是我到目前为止所做的事情:
# create a grid for test-values u
u = np.linspace(0.0001, 0.3, 200)
GridUL, GridUH = np.meshgrid(u, u, indexing='ij')
# J = [JL, JH] would be what I called "J" previously
JL = JSteadyState(GridUL, GridUH, thisType='low')
JH = JSteadyState(GridUL, GridUH, thisType='high')
UL2, UH2 = uSteadyState(JL, Param), uSteadyState(JH, Param)
# check for fixed points in both variables
err = 1e-3
fixedPointL = abs(UL2-GridUL) < err
fixedPointH = abs(UH2-GridUH) < err
fixedPointH & fixedPointH
如何有效地 我检查 UL2
、UH2
与 GridUL
、GridUH
以找到 定点(复数)?
到目前为止,我的方法在很大程度上取决于试错法和网格大小。 scipy.optimize.root
似乎专注于简单的根而不是更复杂的不动点问题。我可以将不动点问题写成根问题,但我想这会非常低效。我应该如何处理这个问题?
您可以尝试使用 scipy.optimize.fixed_point:
import scipy.optimize as optimize
def func(x):
x0, x1 = x
# J = [JL, JH] would be what I called "J" previously
JL = JSteadyState(x0, x1, thisType='low')
JH = JSteadyState(x0, x1, thisType='high')
UL2 = uSteadyState(JL, Param)
UH2 = uSteadyState(JH, Param)
return np.array([UL2, UH2])
err = 1e-3
guess = [0.1, 0.1]
fixedPointL, fixedPointH = optimize.fixed_point(func, guess, xtol=err)
但是请注意,这不会将 x
和 y
限制在域 (0.0001,
0.3)
内,因此这可能会或可能不会找到固定点,具体取决于诸如
你的函数 JSteadyState
和 uSteadyState
的平滑度和你的
初步猜测。