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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Из паскаля в С++ http://www.cyberforum.ru/cpp-beginners/thread1183939.html
В С++ не понимаю ничего. помогите, пожалуйста с кодом. в С++ перевести его. var a: array of real; x,y,z,s,buf: real; i,j,n: integer; begin write('введите количество точек: '); ...
C++ Printf не переносит строку for (int i = 0; i<10; ++i) { Rec.N = i*i; printf("%d", Rec.N, "\n"); } Выводит "0149162536496491" http://www.cyberforum.ru/cpp-beginners/thread1183937.html
C++ Вывести голосование в ячейку таблицы
доброго времени суток! Поделитесь опытом, уже как две недели не могу найти ответ на свой вопрос: Сделал голосовалку rate, выглядит это так "Вверх100%down0%". Это голосовалка отображается под...
C++ Выбрать из файла символы, которые встречаются в нем только один раз
Помогите решить задачу с файлами пожалуйста Задача: Дан файл, содержащий текст на русском языке. Выбрать из него те символы, которые встречаются в нем только один раз, в том порядке, в котором они...
C++ Не вычисляется сумма ряда http://www.cyberforum.ru/cpp-beginners/thread1183877.html
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include "iostream" #include "iomanip" #include <cmath> #include <stdio.h>
C++ Создать класс “Поликлиника”, состоящей из класса ”Врач” Создать класс “Поликлиника”, состоящей из класса ”Врач”. Класс “Поликлиника”: номер поликлиники, фамилия заведующей, телефон заведующей. Класс “Врач” : фамилия врача, специальность. Определить в... подробнее

Показать сообщение отдельно
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81

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

21.05.2014, 20:49. Просмотров 420. Ответов 0
Метки (Все метки)

Здравствуйте.
Возникла проблема в реализации метода Якоби для нахождения приближенного решения для задачи Дирихле.
При уменьшении шага в 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");
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru