2011-11-03 4 views
1

У меня есть нелинейная задача оптимизации (желательно решить в Python):Решить нелинейную систему уравнений с минимальной ошибкой

Учитывая 3 кружки (центры x1..3, y1..3, радиусы d1..3) в двумерной плоскости.

(x-x1)^2 + (y-y1)^2 - r1^2 = 0 
(x-x2)^2 + (y-y2)^2 - r2^2 = 0 
(x-x3)^2 + (y-y3)^2 - r3^2 = 0 

Общая точка (х/у) желательно и может быть вычислена с помощью fsolve (scipy.optimize) в этом случае. Но как решить проблему, если радиусы r1..3 с неопределенностью u1..3, соответственно? То есть истинный радиус окружности находится в интервале r-u ... r + u.

Как найти оптимальную точку (x/y), которая учитывает неопределенность радиусов?

+5

Это 99% -ный численный анализ, 1% программирование. Я думаю, вам будет лучше спросить на сайте [math] (http://www.math.stackexchange.com) –

+1

Какова функция ошибки, которую вы пытаетесь свести к минимуму? Каковы константы (x1, x2, x3, y1, y2, y3, u?) И каковы параметры (r, x и y?) И каковы ограничения (ru unutbu

+0

(x1, y1), (x2, y2), (x3, y3) - центры трех окружностей с радиусами в интервала r1 + -u1, r2 + -u2, r3 + -u3. Чем меньше неуверенность в радиусе круга, тем ближе требуемая точка (x/y) должна быть к этому кругу. – user1027861

ответ

1

Это на самом деле не так сложно, учитывая Decription здесь: http://mathworld.wolfram.com/Circle-CircleIntersection.html

Предлагаемый алгоритм:

  1. Найти х - как описано в ссылке.
  2. Рассчитать y.

Оба должны быть выполнены с использованием любых 2 кругов.

  1. Подключите точки (x, y) и (x, -y) в 3 окружности.
  2. Решение состоит в том, что все три круга пересекаются по адресу: x, y x, -y или совсем нет.

Еще одно предложение ... я прочитал еще раз свой вопрос, и понял, что вы не хотите найти точка это сам ...

Однако, если вы рисуете все 9 кругов на бумаге (3 пересекающихся, плюс 2 меньше и больше для r + e и re, где e - ошибка), вы замечаете следующее. Ваша точка пересечения лежит внутри многоугольника. Вы можетелегко вычислить вершины этого многоугольника. И тогда ваша проблема будет либо: найти точку в полигоне. Или вы пишете функцию возражения, которая находит эти вершины, а затем вы минимизируете эту область.

Чтобы увидеть, что я имею в виду о кружках, запустите:

# excuse me for the ugly code ... 
import pylab 
pylab.axes() 

cir = pylab.Circle((1,0), radius=1, alpha =.2, fc='b') 
cir1 = pylab.Circle((1,0), radius=0.9, alpha =.2, fc='b') 
cir2 = pylab.Circle((1,0), radius=1.1, alpha =.2, fc='b') 
cir3 = pylab.Circle((-1,0), radius=1, alpha =.2, fc='b') 
cir4 = pylab.Circle((-1,0), radius=0.9, alpha =.2, fc='b') 
cir5 = pylab.Circle((-1,0), radius=1.1, alpha =.2, fc='b') 
cir6 = pylab.Circle((0,-1), radius=0.9, alpha =.2, fc='b') 
cir7 = pylab.Circle((0,-1), radius=1.1, alpha =.2, fc='b') 
cir8 = pylab.Circle((0,-1), radius=1, alpha =.2, fc='b') 
pylab.gca().add_patch(cir) 
pylab.gca().add_patch(cir1) 
pylab.gca().add_patch(cir2) 
pylab.gca().add_patch(cir3) 
pylab.gca().add_patch(cir4) 
pylab.gca().add_patch(cir5) 
pylab.gca().add_patch(cir6) 
pylab.gca().add_patch(cir7) 
pylab.gca().add_patch(cir8) 

pylab.axis('scaled') 
pylab.show() 
0

Я хотел бы попробовать этот способ. Для данной точки p вычисляет расстояние от точки до каждого из трех кругов. Это можно сделать, взяв абсолютную величину разницы между (1) расстоянием между точкой и началом окружности и (2) радиусом круга. Тогда ваша целевая функция состоит в том, чтобы свести к минимуму сумму трех расстояний (p до круга A, p до круга B, p до круга C). Я бы попробовал арифметическую сумму, но может быть веская причина для агрегирования по-разному (средний уровень математики). Затем вы используете нелинейный пакет для минимизации целевой функции (т. Е. Суммы трех расстояний).

Теперь у вас есть вес для каждого круга. Таким образом, вы изменяете целевую функцию для уменьшения расстояния по неопределенности каждого круга. Опять же, вам нужна некоторая логика, как это ведение выполняется ... Наивный метод заключается в использовании «взвешенного среднего», который должен принимать 1/сигма^2 как вес для каждого расстояния.так что ваша целевая функция становится

(weighted average distance) 
= (distA * sigmaA^-2 + distB * sigmaB^-2 + distC * sigmaC^-2) 
/(sigmaA^-2 + sigmaB^-2 + sigmaC^-2) 

, где distX является расстоянием от точки до круга, sigmaA это стандартное отклонение расположения окружности (из-за неопределенности местоположения Cicle и размера), ^-2 обозначает квадрат, а затем разделить.

Используйте пакет nonlin для минимизации приведенных выше объектов. функции путем изменения x и y точки.

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