Ранее я задавал похожий вопрос ( Нахождение ближайшего к значению в двух наборах данных с использованием цикла for ?), Но теперь я нахожусь в другом затруднительном положении, поскольку столкнулся с несколько иной проблемой, какТретье измерение было добавлено, потому что у меня есть два независимых параметра, которые меняются.
import numpy as np
import math
f_exp = np.array([1, 1.6, 2.7, 4.4, 7.3, 12, 20, 32, 56, 88, 144, 250000])
e_exp = np.array([7.15, 7.30, 7.20, 7.25, 7.26, 7.28, 7.32, 7.25, 7.35, 7.34, 7.37, 13.55])
n_e_exp = len(e_exp)
ezero = 7.15
einf = 13.55
fc = np.arange(1,11000,1000)
alpha = np.arange(0,1.1,0.1)
log_f_mod = np.arange(-3, 6.5, 0.5)
f_mod = 10 ** log_f_mod
n_f_mod = len(f_mod)
n_fc = len(fc)
n_alpha = len(alpha)
x = np.zeros((n_f_mod, n_fc))
eR = np.zeros((n_alpha, n_f_mod, n_fc))
eI = np.zeros((n_alpha, n_f_mod, n_fc))
e_mod = np.zeros((n_alpha, n_f_mod, n_fc))
invQ = np.zeros((n_alpha, n_f_mod, n_fc))
for i in range(n_alpha):
for j in range(n_f_mod):
for k in range(n_fc):
x[j,k] = np.log(f_mod[j] / fc[k])
eR[i,j,k] = einf + 1/2 * (ezero - einf) * (1 - np.sinh((1 - alpha[i]) * x[j,k]) / (np.cosh((1 - alpha[i]) * x[j,k]) + np.cos(alpha[i] * math.pi / 2)))
eI[i,j,k] = np.abs(1/2 * (ezero - einf) * np.cos(alpha[i] * math.pi / 2) / (np.cosh((1 - alpha[i]) * x[j,k]) + np.sin(alpha[i] * math.pi / 2)))
e_mod[i,j,k] = np.sqrt(eR[i,j,k] ** 2 + eI[i,j,k] ** 2)
invQ[i,j,k] = eI[i,j,k] / eR[i,j,k]
Пока все хорошо, я успешно рассчитал все сценарии eR
, eI
, e_abs
и invQ
, как функции x
и alpha
(независимые параметры, которые меняются).Теперь мне нужно подогнать e_mod
к e_exp
, найдя значения x
и alpha
, при которых e_mod
находится ближе всего к e_exp
.В моем предыдущем вопросе у меня была только одна независимая переменная, поэтому я смог что-то вроде этого:
index = np.zeros((n_e_exp, n_fc), dtype=int)
value = np.zeros((n_e_exp, n_fc))
for l in range(n_fc):
for m in range(n_e_exp):
index[m,l] = np.argmin(np.abs(np.sqrt((e_abs[:,l] - e_exp[m]) ** 2 + (f_mod[:] - f_exp[m]) ** 2))
value[m,l] = np.min(np.abs(np.sqrt((e_abs[:,l] - e_exp[m]) ** 2 + (f_mod[:] - f_exp[m]) ** 2)[index[m,l]]))
BFE = [np.sum(value[:,_]) for _ in range(n_fc)]
M = np.min(BFE)
I = np.array(np.where(M == BFE))
I = I[0]
Затем я попытался сделать его 3D:
n_e_abs = len(e_abs)
index = np.zeros((n_e_abs, n_e_exp, n_fc), dtype=int)
value = np.zeros((n_e_abs, n_e_exp, n_fc))
for a in range(n_e_abs):
for m in range(n_e_exp):
for l in range(n_fc):
index[a,m,l] = np.argmin(np.abs(np.sqrt((e_abs[a,:,l] - e_exp[m]) ** 2 + (f_mod[:] - f_exp[m]) ** 2)))
value[a,m,l] = np.min(np.abs(np.sqrt((e_abs[a,:,l] - e_exp[m]) ** 2 + (f_mod[:] - f_exp[m]) ** 2)[index[a,m,l]]))
BFE = [np.sum(value[:,_]) for _ in range(n_fc)]
M = np.min(BFE)
I = np.array(np.where(M == BFE))
I = I[0]
- Как мне перевести приведенный выше код наилучшего соответствия для работы с трехмерными массивами, где цель состоит в том, чтобы найти и индексы, и значения
fc
и alpha
?
, которые мне нужно найтиоба они, так что я могу построить e_exp
против f_exp
и ближайшую к версии e_mod
против f_mod
на одном графике, что является конечной целью.
Я прошу прощения за действительно конкретный вопрос, я попытался сделать его более обобщенным и упрощенным без какой-либо удачи.