Форум программистов, компьютерный форум CyberForum.ru

Метод Якоби - C++

Восстановить пароль Регистрация
 
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
21.05.2014, 20:49     Метод Якоби #1
Здравствуйте.
Возникла проблема в реализации метода Якоби для нахождения приближенного решения для задачи Дирихле.
При уменьшении шага в 2 раза ошибка приближения должна уменьшиться в 4 раза. Но этого не происходит.
Пересмотрела программу 1000 раз, не могу понять, в чем дело.
Вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
 
#define N 10 //количество шагов
 
//точное решение
double  u(double x,double y){    
        return (sin(x)*sin(y*y));
}
 
//правая часть уравнения
double  f(double x,double y){       
       return (sin(x)*sin(y*y)*(0.7+4.4*y*y));
}
double norm (double **u1, double **u2){
    double u3[N][N];
    double max;
    int i,j;
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            u3[i][j]=abs(u1[i][j]-u2[i][j]);
        }
    }
    max=-100;
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
        if(u3[i][j]>max)
            max=u3[i][j];
        }
    }
    return max;
}
 
void main(){
double h,n=1,eps=0.0001;
int i, j,k=0;
double alfa=-0.7,beta=-1.1;
double **u1 = (double **)malloc(N * sizeof(double *));  //Матрица на к-1 шаге
for (i = 0; i <N; i++)
    u1[i] = (double *)malloc((N) * sizeof(double));
 
double **u2 = (double **)malloc(N * sizeof(double *));  //Матрица на к шаге
for (i = 0; i <N; i++)
    u2[i] = (double *)malloc((N) * sizeof(double));
double **u0 = (double **)malloc(N * sizeof(double *));  //Матрица ошибки
for (i = 0; i <N; i++)
    u0[i] = (double *)malloc((N) * sizeof(double));
 
for(i=0; i<N; i++)
    for(j=0; j<N; j++)
        u1[i][j]=0;
 
//краевые условия
h=1.0/(N-1);
 
for(i=0; i<N; i++)
    {
        u1[0][i]=u(0, h*i);         //первая и последняя строка
        u1[N-1][i]=u(1, h*i);
        u2[0][i]=u(0,h*i);
        u2[N-1][i]=u(1,h*i);
    }
for(i=0; i<N; i++)
    {
        u1[i][0]=u(h*i,0 );         //первый и последний столбец
        u1[i][N-1]=u(h*i, 1);
        u2[i][0]=u(h*i,0);
        u2[i][N-1]=u(h*i, 1);
    }
    
//начальное приближение
for(i=1; i<N-1; i++){
    for(j=1; j<N-1; j++){
        u1[i][j]=1;
        u2[i][j]=2;
    }
}
    
//Якоби
    
        while(n>eps){
        for (i=1;i<N-1;i++){
            for (j=1;j<N-1;j++){            //изменение начального приближения
                u1[i][j]=u2[i][j];
            }
        }
        for (i=1;i<N-1;i++){
            for (j=1;j<N-1;j++){
                u2[i][j]=(alfa*(u2[i-1][j] + u2[i+1][j]) + beta*(u2[i][j-1]+ u2[i][j+1]))/(2*( alfa + beta) )-h*h*f(i*h,j*h)/(2*( alfa + beta));
            }
        }
        n=norm(u1,u2); //считаем норму
        k++;
    };
    double max=-100;                            //ищем ошибку аппроксимации
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            u0[i][j]=abs(u(i*h,j*h)-u2[i][j]);
        }
    }
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            if(u0[i][j]>max)
                max=u0[i][j];
        }
        
    }
    printf("Oshibka pribligheniay = " "%e " ,max);
    printf("\n");
    printf("Kolichestvo iteraciy = " "%d ",k); 
    printf("\n");
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2014, 20:49     Метод Якоби
Посмотрите здесь:

C++ метод якоби
C++ Метод итерации( Якоби)
C++ Вычисление символа якоби
C++ Решение СЛАУ методом Якоби
C++ Программа на решение СЛАУ методом Якоби
C++ Метод вращений Якоби с++
Метод Якоби. Выводит результат -1.INF и -1.IND C++
C++ Итерационные методы. Метод Якоби

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 07:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru