2015-03-23 3 views
2

У меня есть функция f(x,y)->(a,b), которая отображает некоторый ввод (x,y) на выход (a,b). Вывод представляет собой комплексное число. Меня интересует обратная функция g(a,b)->(x,y). Но так как эта инверсия не может быть выполнена аналитическим способом, мне нужно сделать это с помощью численного приближения.Обратный комплекс 2D таблица поиска

С f(x,y) дорого стоит вычислить. Моя идея состояла в том, чтобы использовать подход таблицы поиска. Я могу создать таблицу 2D-поиска с размерами (x,y) (таблица прямого поиска), но мне действительно нужна обратная эта таблица поиска, дающая (x,y) на основе заданного (a,b).

Для инверсии таблицы поиска самый простой подход, который я могу придумать, - использовать записи таблицы прямого поиска как вершины и интерполировать между ними в регулярной сетке, получая обратную таблицу поиска. Если обратная таблица поиска будет большой для требуемой точности, я бы сгенерировал грубую таблицу и использовал значения как начальные значения для алгоритма оптимизации. Есть ли какие-то более легкие подходы, которые мне не хватает?

function definition

Где kz, theta0 постоянны и hV, sigma являются (x,y).

+0

Боюсь, что лучший алгоритм будет зависеть от вашей функции. Можете ли вы предоставить свою функцию? – Tolokoban

+0

Я добавил определение функции. – Stefan

+0

Если $ \ theta_0 $ постоянна, то $ \ cos \ theta_0 $. Тогда вы не можете устранить $ 2 \ sigma \ over \ cos \ theta_0 $ из своей функции? Кстати, как вы положили уравнения в свое сообщение? Мой LaTeX не анализируется. – Tolokoban

ответ

2
  1. для f(x,y) вы можете использовать f(x,y)->(a,b) 2D LUT (Look Up Table)

    Но сохраненные точки сеток должны быть выбраны так плотны, так что есть максимум одна шишки на сетку прямоугольника, в противном случае интерполяция будет не работает правильно.

    Если вы хотите использовать линейную интерполяцию, то локальный min/max должен быть точками внутри LUT, поскольку для полиномиальной интерполяции более высокого порядка это не всегда необходимо. Я хотел бы использовать 4 point cubic interpolation

  2. как вычислить g(a,b)->(x,y)

    • первый реверса отображение возможно?
    • поэтому сколько (x,y) баллов вернуть то же самое (a,b)=f(x,y)?
    • это то же самое, что и вопрос: Is f функция или нет?

    если f не функционирует, то у вас проблемы и вы не можете решить эту проблему, если каким-то образом не подразделяют диапазон для поддиапазонов, где f является функцией, а затем вы должны выбрать правильный выбор в соответствии с некоторыми правилами зависимых о том, что вы пытаетесь сделать. Поэтому допустим, что f является функцией

    Итак, как вычислить (x,y)=g(a,b), что f(x,y)=(a,b)?

    1. Я бы начал с приближения к результату. Так что попробуйте достаточно (x,y) значений по всему диапазону и сохраните ближайшую точку до нужного выхода так, чтобы |f(x,y)-(a,b)| был минимальным.

    2. Затем запустите это снова, но не на полном диапазоне, но вокруг этой точки вместо

      • рекурсивно повышения точности до точки вам нужно.
      • смотрите здесь Increasing accuracy of solution of transcendental equation там я вычислительное аналогичные проблемы имеют 1D LUT из 2D точек (a(t),y(t)) и нужна обратная 3D точка (a0,y0,z0) Вы можете использовать мое приближение класса там

Верстка приближений делается так:

int n=5; // recursions 
double e; // Error Of Solution Variable 
approx ax,ay; 
//   min max step 
for (ax.init(-100.0,+100.0,10.0,n,&e);!ax.done;ax.step()) 
for (ay.init(-100.0,+100.0,10.0,n,&e);!ay.done;ay.step()) 
    { 
    e=|f(ax.a,ay.a)-(a,b)|; 
    } 
// here (ax.a,ay.a) should hold your solution for input point `(a,b)` 
  • начальный шаг должен быть небольшой, так что нет шишка пропустил
  • если ваша g(a,b) форма является слишком сложным, то это, вероятно, не работает должным образом

Из этого можно вычислить таблицу обратного LUT ...

  • Каждая рекурсия делит этот шаг на 10, поэтому выбирайте n с умом.

Для 2D и особых точек производительность этого не так плохо O((log(N))^2). Я делаю это на 3D O((log(N))^3) с 100 точек на e вычисление, и это мучительно медленно (около 35 секунд)

  • где N=(10^n)*(max-min)/step и n этого числа рекурсий
  • точности step/(10^n)
  • не забудьте изменить min, max на используемые диапазоны ...
+0

Прежде всего большое спасибо за этот ответ! К сожалению, 'f (x, y)' не является Инъективной функцией, и поэтому ther're являются '(x, y)', давая один и тот же ответ (a, b) '. Но я посмотрю на это, возможно, может помочь подразделение 'f'. Однако ваш подход локальной близости ответов 'f' с закрытием' (x, y) 'выглядит довольно интересно. Правильно ли, что вы не вычисляете фактическую таблицу поиска, а используете ее как процедуру аппроксимации? – Stefan

+1

@Stefan вы вычисляете точки LUT одним приближением, а затем просто используете это ... – Spektre

 Смежные вопросы

  • Нет связанных вопросов^_^