Решить нелинейную систему уравнений с минимальной ошибкой

1

У меня есть некоторая проблема нелинейной оптимизации (желательно разрешена в python):

Даны 3 круга (центры x1..3, y1..3, радиусы d1..3) в 2D-плоскости.

(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

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

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

  • 5
    Это 99% численный анализ, 1% программирование. Я думаю, вам повезет больше, если вы спросите на математическом сайте
  • 1
    Какую функцию ошибок вы пытаетесь минимизировать? Каковы константы (x1, x2, x3, y1, y2, y3, u?) И каковы параметры (r, x и y?) И каковы ограничения (ru <r1, r2, r3 <r + u ?)?
Показать ещё 5 комментариев
Теги:
optimization
scipy
nonlinear-optimization

2 ответа

1

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

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

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

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

  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 - стандартное отклонение местоположения круга (из-за неопределенности местоположения и размера ячейки), ^-2 обозначает квадрат, а затем делит.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню