2014-10-26 4 views
0

Я пытаюсь привязать круг к некоторым данным. Это требует численного решения набора трех нелинейных уравнений (см. Метод полных наименьших квадратов this document).Как решить неспецифические нелинейные уравнения?

Мне кажется, что функция NEWTON, предоставляемая IDL, подходит для решения этой проблемы. NEWTON требует имя функции, которая будет вычислять значения системы уравнений для конкретных значений независимых переменных:

FUNCTION newtfunction,X 
    RETURN, [Some function of X, Some other function of X] 
END 

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

Есть ли способ обойти это? Можно ли программно программировать функции в IDL или даже просто передавать в наборе данных каким-либо другим способом?

+0

Обычно в этих случаях вы определяете функцию модели, которая принимает набор параметров и фактических точек данных. Например, предположим, что ваша функция Y = A * X + B. Тогда модельная функция (в вашем случае, newtfunction) примет массив значений X, а затем массив значений параметров, например param = [A, B] , Затем вы предоставляете подпрограмму подстановки с именем функции и начальными догадками, а затем отпустите ее. –

+0

Вы можете взглянуть на [веб-страницу] Крейга Марквардта (http://www.physics.wisc.edu/~craigm/idl/), в которой есть несколько процедур, которые лучше, чем метод Ньютона (например, Levenberg-Marquardt алгоритм). –

+0

Ни один из этих комментариев действительно не затрагивает мой вопрос. Функция newt по определению допускает только один параметр. Если с тех пор нашел другой способ привязать круг к данным, тем не менее это тема другого вопроса/ответа. – maxf130

ответ

0

Я не специалист по этому вопросу, но если бы я решил эту проблему, я бы сделал следующее. Вместо решения системы из трех нелинейных уравнений для поиска трех неизвестных (т. Е. xc, yc и r), я бы использовал подпрограмму оптимизации, чтобы сходиться к решению, начиная с начального предположения. Для этого самого крутого спуска можно использовать сопряженный градиент или любой другой метод многомерной оптимизации.

Я просто быстро вывел наименьших квадратов уравнение для вашей проблемы, как (пожалуйста, проверьте перед использованием):

F = (sum_{i=1}^{N} (xc^2 - 2 xi xc + xi^2 + yc^2 - 2 yi yc + yi^2 - r^2)^2)

Вычисление градиента для этой функции достаточно легко, так как это просто суммирование, а поэтому написать самый крутой код спуска будет тривиальным, рассчитать xc, yc и r.

Надеюсь, это поможет.

0

Обычно используется блок COMMON в этих типах функций для передачи других параметров, кешированных значений и т. Д., Которые не являются частью вызывающей сигнатуры цифровой процедуры.

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