Как решить гомогенные линейные уравнения с NumPy?

Мое решение Вашей проблемы было бы к также:

1 - используют интервал вместо перечислений: Объявите свой ints в анонимном пространстве имен в Вашем файле CPP (не в заголовке):

namespace
{
   const int FUNCTIONALITY_NORMAL = 0 ;
   const int FUNCTIONALITY_RESTRICTED = 1 ;
   const int FUNCTIONALITY_FOR_PROJECT_X = 2 ;
}

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

namespace
{
   const int FUNCTIONALITY_begin = 0 ;
   const int FUNCTIONALITY_NORMAL = 0 ;
   const int FUNCTIONALITY_RESTRICTED = 1 ;
   const int FUNCTIONALITY_FOR_PROJECT_X = 2 ;
   const int FUNCTIONALITY_end = 3 ;

   bool isFunctionalityCorrect(int i)
   {
      return (i >= FUNCTIONALITY_begin) && (i < FUNCTIONALITY_end) ;
   }
}

2: создайте полный класс с ограниченными инстанцированиями константы, как сделанный в Java. Вперед объявите класс, и затем определите его в файле CPP и instanciate только подобные перечислению значения. Я сделал что-то как этот в C++, и результат столь не удовлетворял, как желаемый, поскольку требовался некоторый код для моделирования перечисления (конструкция копии, оператор =, и т.д.).

3: Как предложено прежде, используйте конфиденциально заявленное перечисление. Несмотря на факт пользователь будет видеть его полное определение, он не будет в состоянии использовать его, ни использовать закрытые методы. Таким образом, Вы обычно будете в состоянии изменить перечисление и содержание существующих методов, не нуждаясь в перекомпиляции кода с помощью класса.

Мое предположение было бы любой решением 3 или 1.

6
задан Peter Mortensen 2 December 2009 в 21:14
поделиться

1 ответ

Вы можете использовать SVD или QR-разложение для вычисления нулевого пространства линейной системы, например, что-то вроде:

import numpy

def null(A, eps=1e-15):
    u, s, vh = numpy.linalg.svd(A)
    null_space = numpy.compress(s <= eps, vh, axis=0)
    return null_space.T

Это дает для вашего примера:

>>> A
matrix([[-0.75,  0.25,  0.25,  0.25],
        [ 1.  , -1.  ,  0.  ,  0.  ],
        [ 1.  ,  0.  , -1.  ,  0.  ],
        [ 1.  ,  0.  ,  0.  , -1.  ]])

>>> null(A).T
array([[-0.5, -0.5, -0.5, -0.5]])

>>> (A*null(A)).T
matrix([[ 1.66533454e-16, -1.66533454e-16, -2.22044605e-16, -2.22044605e-16]])

См. Также раздел Числовые вычисление пустого пространства в Википедии.

8
ответ дан 9 December 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: