Как выровнять данные по известной формуле с двумя независимыми переменными? - PullRequest
0 голосов
/ 23 октября 2018

Предположим, у меня есть нелинейная формула типа y = (ax + bx ^ 2 + cx ^ 3) * dx1 ^ 2

Где a, b, c, d - коэффициенты, которые нужно найти, а x и x1это данные в таблице, которую я пытаюсь уместить.

Мне нужен алгоритм оптимизации, который я могу написать в коде (например, C или Delphi), чтобы пройти через итерацию, чтобы получить разумные коэффициенты a, b, c, d.

Не хочу использовать Matlab или пакеты, так как это должна быть отдельная программа.Ссылка на delphi или активный блок X полезна.Не против заплатить за программное обеспечение, если я могу использовать его свободно.

1 Ответ

0 голосов
/ 24 октября 2018

Ваша задача является линейной по a, b, c и d, даже если она является кубической в ​​данных.Поэтому я бы предложил сформулировать это как обычную линейную задачу наименьших квадратов .Позвольте мне переименовать ваш x1 в z.Идея такова: у вас есть

топор i + bx i 2 + cx i 3 + dz i 2 ≈ y i

для некоторого i∈ {1,2,3… n}.Вы можете написать это в виде приближенного матричного уравнения:

⎡x₁ x₁² x₁³ z₁²⎤   ⎡a⎤   ⎡y₁⎤
⎢x₂ x₂² x₂³ z₂²⎥   ⎢b⎥   ⎢y₂⎥
⎢x₃ x₃² x₃³ z₃²⎥ ∙ ⎢c⎥ ≈ ⎢y₃⎥
⎢ ⋮ ⋮  ⋮  ⋮ ⎥   ⎣d⎦   ⎢⋮⎥
⎣xₙ xₙ² xₙ³ zₙ²⎦         ⎣yₙ⎦

Или, короче,

M ∙ X ≈ Y

Теперь вы умножаете обе стороныс транспонированием этой матрицы M:

M T ∙ M ∙ X = M T ∙ Y

Уведомлениечто я изменил с ≈ на =, потому что решение наименьших квадратов будет точно соответствовать этому измененному уравнению (по многим причинам я не хочу вдаваться в подробности).Это простая система линейных уравнений 4 × 4.Решите, используя обычные методы (такие как Гауссово исключение ), чтобы найти X = (a, b, c, d).

Если n большое, вы можете даже вычислить (M T ∙ M) и (M T fly Y) на лету, никогда не сохраняя саму М.Таким образом, 4 × 4 + 4 = 20 номеров будут всей памятью, которую вам нужно поддерживать между входными записями.На самом деле (M T ∙ M) составляет симметричный , поэтому для матрицы достаточно 10 чисел, всего 14.

...