Расчет параболы: что я делаю не так? - PullRequest
2 голосов
/ 30 апреля 2010

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

Напомним формулу: у = топор ^ 2 + бх + с

Поскольку первая заданная мной точка находится в точке x1 = 0, у нас уже есть c = y1. Нам просто нужно найти а и б. Использование:

y2 = ax2 ^ 2 + bx2 + c y3 = ax3 ^ 2 + bx3 + c

Решение уравнений для b дает:

b = y / x - топор - cx

Теперь установите оба уравнения равными друг другу, чтобы b выпало

y2 / x2 - ax2 - cx2 = y3 / x3 - ax3 - cx3

Теперь решение для меня дает:

a = (x3 * (y2 - c) + x2 * (y3 - c)) / (x2 * x3 * (x2 - x3))

(это правильно?!)

А затем снова используя b = y2 / x2 - ax2 - cx2, чтобы найти b. Однако до сих пор я не нашел правильных коэффициентов a и b. Что я делаю не так?

Редактировать

Хорошо, я понял, но мне пришлось использовать CAS, потому что я не знаю, как инвертировать символьные матрицы вручную. (Похоже, Гаусс не работает)

Запись в матричной форме:

| 0     0   1 |   |a|
| x2^2  x2  1 | * |b| = Y
| x3^2  x3  1 |   |c|

Давайте назовем Матрицу M и умножим слева на M ^ (- 1)

|a|
|b| = M^(-1)*Y
|c|

Тогда я вышел из клена:

a = (-y1 * x2 + y1 * x3 - y2 * x3 + y3 * x2) / x2 / x3 / (-x2 + x3)

Думаю, я совершил глупую ошибку где-то вверху.

Что дает мне тот же результат, что и формула в приведенной выше теме.

1 Ответ

4 голосов
/ 01 мая 2010

Ваша проблема в том, что у вас есть три неизвестных (коэффициенты a, b и c) и только одно уравнение, которое я вижу: y = y1, когда x = 0; это дает с = у1, как вы сказали.

Без дополнительной информации все, что вы можете сделать, это сказать, как b связано с a. Вот и все. Нет одного решения, есть много решений.

Если вы говорите мне, что у вас есть две другие точки (x2, y2) и (x3, y3), то вы должны подставить их все в уравнение и решить. Начните с:

альтернативный текст http://www.equationsheet.com/latexrender/pictures/41a2186ee8f0fcad42693e5c6211e258.gif

Теперь подставим три точки (x1, y1), (x2, y2) и (x3, y3):

альтернативный текст http://www.equationsheet.com/latexrender/pictures/4929b2060c4fe90914da0ac237f68e38.gif

Это матричное уравнение, которое вам нужно инвертировать. Вы можете использовать правило Крамера или разложение LU. Другая возможность Wolfram Alpha :

http://www.wolframalpha.com/input/?i=inverse{{x1*x1,+x1,+1},+{x2*x2,+x2,+1},+{x3*x3,+x3,+1}}

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

Кодировать довольно легко, если заметить, что

det = (x2 x1 ^ 2-x3 x1 ^ 2-x2 ^ 2 x1 + x3 ^ 2 x1-x2 x3 ^ 2 + x2 ^ 2 x3)

Разделите все записи в матрице на это значение. Числители довольно просты:

альтернативный текст http://www.equationsheet.com/latexrender/pictures/93fc1a5b2cfddcc8685045937396cee3.gif

Разделите это на определитель, и вы получите обратное.

Если у вас больше очков, чем три, вам нужно подгонять по методу наименьших квадратов. Проделайте тот же трюк, подставив все имеющиеся у вас точки (x1, y1) ... (xn, yn). У вас будет больше уравнений, чем неизвестных. Умножим обе стороны на транспонирование матрицы nx3 и решим. Вуаля - у вас будет набор коэффициентов, которые минимизируют квадраты ошибок между точками и значениями функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...