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

Я пытаюсь подогнать некоторые точки к обратной параболе в виде F (x) = 1 / (ax ^ 2 + bx + c).

Моя цель состоит в том, чтобы запрограммировать функцию на с ++, которая будет принимать набор из 10-30 точек и подгонять их к обратной параболе.

Я начал пытаться получить аналитическое выражение, используя наименьшие квадраты, но не могу достичь результата. Я попробовал вручную (немного безумно), а затем попытался аналитически решить выражения для a, b и c, но mupad не дает мне результата (я довольно новичок в mupad Matlab, так что, возможно, я делаю это неправильно) ,
я больше не знаю, как подойти к проблеме.

Могу ли я получить аналитическое выражение для этой конкретной проблемы? Я также видел алгоритмы для общего подбора наименьших квадратов, но мне не нужен такой сложный алгоритм, мне просто нужно это для этого уравнения.
Если нет, то как бы люди из StackOverflow подошли к проблеме?

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

РЕДАКТИРОВАТЬпример

Извините, изображение немного грязное, но это то, что мне нужно.
Данные выделены синим цветом (эти данные особенно шумные). Мне нужно использовать только данные, которые находятся между вертикальными линиями (набор данных слева и еще один справа).

Результат подбора находится в красной линии.

все это было сделано с помощью Matlab, но мне нужно сделать это на C ++.

Я постараюсь опубликовать некоторые данные …

введите описание изображения здесь

Изменить 2: Я на самом деле сделал примерку в Matlab следующим образом (не фактический код):

 create linear system Ax = b, with
A = [x²  x  1]
x = [a; b; c]
b = 1/y;

Это должно работать, не так ли? Тогда я могу решить, используя псевдоинвер Мура-Пенроуза, рассчитанный с помощью SVD. Не так ли?

0

Решение

Там нет аналитического решения наименьших квадратов; это проблема минимизации, и для ее решения требуются умные итеративные методы. (нелинейный LS — спасибо @insilico)

Вы можете попробовать итеративный метод в стиле Ньютона (переставляя ваше уравнение), но я не думаю, что он будет легко сходиться для вашей функции — которая будет очень нелинейной в двух точках!

Я бы порекомендовал использовать библиотеку для этого. такие как поиск nelder-mead

http://www.codecogs.com/code/maths/optimization/nelder.php

Вы просто предоставляете свою функцию ошибки — которая

sum( pow(F(x) - dataY(x), 2) )

и предоставить набор начальных значений (удар в темноте в растворе);
У меня был хороший успех с Nelder-Mead.

Я не думаю, что вы найдете хорошее решение с открытым кодом.

2

Другие решения

Если я вас правильно понимаю, вам просто нужно знать формулу для соответствия определенному набору данных, верно?

Если это так, то вам просто нужно получить программу подгонки кривой и подгонять кривую, используя желаемый метод. Затем реализуйте формулу, показанную подгонкой кривой.

Существует несколько программ подгонки кривых:

Кривая Эксперт

http://www.curveexpert.net/

* Eurequa *

http://creativemachines.cornell.edu/eureqa

Кроме того, некоторые пакеты электронных таблиц могут иметь необходимые средства подгонки кривой.

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

1