Метод Сурио для характеристического многочлена

Кто-нибудь знает метод Сурио для нахождения характеристического многочлена любой матрицы размера n × n? Первый коэффициент я узнал, это очевидно, а как мне узнать остальные коэффициенты? После мне нужно инвертировать матрицу, но я знаю, как это сделать.

#include <iostream> 
#include <fstream>
using namespace std;

double trace(double a[5][5],int n){ 
        int i;
        double trace=0;
        for(i=0;i<n;i++) 
            trace+=a[i][i]; 
        return trace;
}
double prod(double a[5][5],double b[5][5],int n) {
    double c[5][5];
    int i,j,k;
    cout << "\nProd:\n"; 
    for(i=0;i<n;++i){ 
        for(j=0;j<n;++j){ 
            c[i][j]=0; 
            for(k=0;k<n;++k) 
                c[i][j]=c[i][j]+(a[i][k]*b[k][j]);
                cout << c[i][j] << " "; 
        } 
        cout << "\n"; 
    } 
    return c[i][j]; 
}
double theta(double a[5][5], int n){
    int i;
    double theta[5];
    theta[1]=-trace(a,n);
    for(i=0;i<n;i++)
        cout << "Theta[" << i+1 << "]=" << theta[i+1] << "\n";
    return theta[i+1];
}

int main(){ 
    ifstream f("a.txt"); 
    ifstream g("b.txt");
    double a[5][5],b[5][5];
    int i,j,n; 
    f >> n; 
    g >> n; 
    for(i=0;i<n;++i) 
        for(j=0;j<n;++j) 
            f >> a[i][j]; 
    cout << "Matrix A:"<<endl;
    for(i=0;i<n;++i){
        for(j=0;j<n;++j) 
            cout << a[i][j] << " ";
            cout << endl;
    }
    cout << endl;
    for(i=0;i<n;++i) 
        for(j=0;j<n;++j) 
            g >> b[i][j]; 
    cout << "Matrix B:" << endl;
    for(i=0;i<n;++i){ 
        for(j=0;j<n;++j) 
            cout << b[i][j] << " ";
            cout << endl;
    }

        cout << endl;
        cout << "Trace = ";
        cout << trace(a,n);
        cout << endl;
        prod(a,b,n);
        cout << endl;
        theta(a,n);
    }

person user3671642    schedule 29.05.2014    source источник
comment
Так? Каков ваш вопрос, связанный с кодом? Что делает код, который вы разместили? Какая у вас проблема с этим кодом?   -  person kebs    schedule 29.05.2014
comment
Мне нужно узнать все тета (многочленные коэффициенты) и я не знаю как это сделать, этот код должен найти коэффициенты и в конце сделать обратную матрицу А. Называется метод Сурьо. Проблема в моем коде в том, что я не знаю, как вычислить тета.   -  person user3671642    schedule 29.05.2014
comment
Вы можете найти больше ссылок, если будете искать метод Леверье-Фаддеева. См., например, math.stackexchange.com/a/405975/115115   -  person Lutz Lehmann    schedule 30.05.2014
comment
Изобретен и заново открыт Урбеном Леверье - 1840 г., Дмитрием К. Фаддеевым - 1949 г., Дж. С. Фреймом - 1949 г., Жан-Мари Сурио - 1948 г., а также У. Вегнером - 1953 г. и Л. Чанки - 1973 г.   -  person Lutz Lehmann    schedule 30.05.2014
comment
Вместо того, чтобы пытаться самостоятельно выполнять низкоуровневое кодирование, которое очень подвержено ошибкам, я предлагаю вам использовать некоторую библиотеку матричных вычислений. GSL, например, очень стабилен, но имеет только C API. Eigen (eigen.tuxfamily.org) с собственным C++ API также является очень хорошим выбором.   -  person kebs    schedule 30.05.2014
comment
Благодарю вас! Это очень помогло, я новичок, поэтому я не так много знаю.   -  person user3671642    schedule 30.05.2014


Ответы (1)


Взято с сайта https://math.stackexchange.com/a/405975/115115 пользователя J. M.

C=A;
for k=1,…,n

    if k>1
        C=A*(C+c[n−k+1]*I);

    c[n−k]=−tr(C)/k;

end for

Если вы умеете читать по-немецки, есть вики-страница с расширенным алгоритмом псевдокода по адресу https://de.wikipedia.org/wiki/Algorithmus_von_Faddejew-Leverrier (добавьте 2017: или столь же хорошую английскую версию https://en.wikipedia.org/wiki/Faddeev%E2%80%93LeVerrier_algorithm)

Если вы хотите напрямую вычислить обратную матрицу, вам нужно, как на вики-странице, использовать матрицу B, которая связана с матрицей C выше через C=AB. Это дает, как видно на вики-странице, немного более сложный алгоритм. Однако тогда последняя матрица B удовлетворяет условию AB=-c[0]*I, так что обратную матрицу, если она существует, можно вычислить напрямую.

person Lutz Lehmann    schedule 29.05.2014