Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Метод сопряжённых градиентов в С++

28K
06 ноября 2007 года
Party3an
8 / / 15.10.2007
Доброго времени суток! Помогите написать программу на С++ методом сопряжённых градиентов. Полученное решеине уточнить методом Ньютона!
Теория в прикрепленном файле!
29K
07 ноября 2007 года
Anemona
8 / / 09.09.2007
Код:
//----------метод сопряженных градиентов---------------
double *SoprGrad(double **A, int n){
    cout<<"Reshenie metodom sopryjennyh gradientov:"<<endl;
    int k=0;
    double *y=new double[n+1], *x=new double[n+1],
        *ax=new double[n+1], *ap=new double[n+1],
        *z=new double[n+1], *z1=new double[n+1],
        *p=new double[n+1];
    double a, b, nz;

    //X0==
    cout<<endl<<"Vvedite nachal'noe priblizhenie dlya matrici: "<<endl;
    for(int i=0;i<n;i++)
        cin>>x;

   
    double e;
    cout<<"Vvedite to4nost':";
    cin>>e;
   
//  cout<<"Nevyazka na4al'nogo priblijeniya ravna:"<<endl;
    ax=MatrixByVector(A,x,n);
    for (i=0; i<n; i++) z=A[n]-ax;
//  PrintV(z,n);
    if (Scal(z,z,n)!=0){
    for (i=0; i<n;i++)  p=z;
    nz=1000.;
    while(nz>e){
        ap=MatrixByVector(A,p,n);
        a=Scal(z,p,n)/Scal(z,ap,n);
        for (i=0; i<n; i++) {
            y=x+a*p;
            z1=z-a*ap;
        }
        nz=NormaV(z1,n);
        b=Scal(z1,ap,n)/Scal(p,ap,n);
        for (i=0; i<n; i++) {
            p=z1-b*p;
            z=z1;
            x=y;
        }
        k++;
    }
    cout<<"k="<<k<<endl;
    return y;}
    else {
        cout<<"k=="<<1<<endl;
        return x;}
}
double* MatrixByVector(double** H,double* V,int n){
    double* tmp=new double[n];
    double sum=0;
    for (int i=0;i<n;++i){
        for (int j=0;j<n;++j)
            sum+=V[j]*H[j];
        tmp=sum;
        sum=0;}
    return tmp;}
double NormaV(double *V, int n){
    double norma;
    double s=0;
    for(int i=0;i<n;i++)
        s+=V*V;
    norma=sqrt(s);
    return norma;}
double Scal(double *v1, double *v2, int n){
    double *v=new double[n+1];
    double s=0.;
    for (int i=0; i<n; i++){
        s=v1*v2+s;}
    return s;
}

[COLOR="Red"]Кто будет код оформлять по Правилам раздела ? Отредактировал. [/COLOR]модератор.
78K
28 ноября 2011 года
Halk
1 / / 28.11.2011
спасибо помогло)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог