Оптимизация для поиска минимума функции, содержащей комплексные числаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Оптимизация для поиска минимума функции, содержащей комплексные числа

Сообщение Anonymous »

Я пытаюсь использовать Python, чтобы найти значение вектора z, соответствующее минимуму функции. z может быть прямоугольной формы, z = a+b*j, или полярной формы, z = величина, фаза. Я пытался ввести его несколькими способами, и в настоящее время в блоке кода ниже он записан как z = complex(cwx,cwy). Я использовал сетку, пытаясь создать пространство возможных векторов для вычисления функции.
Функция содержит z и другие комплексные числа (векторы в полярной форме, которые я конвертирую в прямоугольный). Функция оценивается как скаляр, поэтому должен быть некоторый вектор, который приводит к минимуму. Надеюсь, кто-нибудь укажет мне правильное направление, поскольку я новичок в оптимизации и пока что барахтаюсь :| Существует ли функция оптимизации, которая хорошо работает с комплексными числами?
from math import radians
from cmath import rect
import numpy as np
import scipy.optimize as opt

# input variables, to be obtained via GUI
w1 = 0.5
w2 = 0.5
a1m = 53
a1p = 280
a2m = 46
a2p = 245
s11m = 1.8
s11p = 338
s21m = 1.1
s21p = 332
cwm_max = 500

f = lambda z: (w1*abs(rect(a1m,radians(a1p)) + complex(cwx,cwy) / rect(s11m,radians(s11p))) +
w2*abs(rect(a2m,radians(a2p)) + complex(cwx,cwy) / rect(s21m,radians(s21p))))

# create a grid of potential vectors wrapping from 0 to 360 degress with max amplitude = cwm_max:
cwx, cwy = np.meshgrid(np.linspace(-cwm_max,cwm_max,200),np.linspace(-cwm_max,cwm_max,200))

# opt.minimze requires a guess argument
guess = np.array([0, 200])
sol = opt.minimize(f, guess)
print(sol)

Ему не нравится использование complex(cwx,cwy) в функции. Думает, что я хочу ввести скаляр?
f = lambda z: (w1*abs(rect(a1m,radians(a1p)) + complex(cwx,cwy) / rect(s11m,radians(s11p))) +
^^^^^^^^^^^^^^^^
TypeError: only length-1 arrays can be converted to Python scalars

и opt.minimize() не кажутся лучшим инструментом для этой работы, поскольку вызывают множество проблем с трассировкой.

Альтернатива грубой силы с вложенными циклами сделала свое дело:
cwm_max = 500
dim = 1200
mag_sum = 1000*np.ones((dim,dim))

cwx = np.linspace(-cwm_max,cwm_max,dim)
cwy = np.linspace(-cwm_max,cwm_max,dim)

for p in range(dim):
for q in range(dim):
mag_sum[p,q] = (w1 * abs(rect(a1m, radians(a1p)) + complex(cwx[p],cwy[q]) / rect(s11m, radians(s11p)))+ w2 * abs(rect(a2m, radians(a2p)) + complex(cwx[p],cwy[q]) / rect(s21m, radians(s21p))))

# rectangular to polar
def polar_deg(z):
"""expects a single complex number in cartesian form (a+bj),
returns mag & phase (degrees, 0 to 360)"""
mag, phase_r = cmath.polar(z)
phase_d = math.degrees(phase_r)
if phase_d < 0:
phase_d += 360
return mag, phase_d

a,b = np.unravel_index(mag_sum.argmin(), mag_sum.shape)
cwz = complex(cwx[a],cwy)
cwm, cwp = polar_deg(cwz)


Подробнее здесь: https://stackoverflow.com/questions/782 ... ex-numbers
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»