Я нахожу минимум f (x) = || Ax-y || ^ 2, с заданными A (n, n) и y (n).
Эта проблема известна как метод наименьших квадратов, и вы выполняете оптимизацию без ограничений.Написание конечно-разностного решателя градиентного спуска на C не совсем правильный подход.Прежде всего, вы можете легко рассчитать производную аналитически, поэтому нет никаких причин делать конечную разницу.Кроме того, проблема является выпуклой, так что она становится еще проще.
(Пусть A 'обозначает транспонирование A)
d/dx ||Ax - y||^2 = 2*A'*(Ax - y)
, поскольку это проблема, которая, как мы знаем, будетпроисходят, когда производная равна 0
0 = 2*A'(Ax - y)
A'y = A'Ax
inverse(A'A)*A'y = x
A'A гарантированно обратимо, потому что оно положительно определено, поэтому проблема сводится к вычислению этого обратного значения, которое равно O (N ^ 3).Тем не менее, есть библиотеки для наименьших квадратов как в C, так и в Python, поэтому вам, вероятно, следует просто использовать их вместо написания собственного кода.