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

Метод конечных разностей для краевой задачи - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.81
manyak666
0 / 0 / 0
Регистрация: 26.03.2013
Сообщений: 7
29.05.2013, 18:01     Метод конечных разностей для краевой задачи #1
Помогите пожалуйста. Надо написать программу, которая решает краевую задачу для ОДУ 2 порядка методом конечных разностей. Никак не могу разобраться, подскажите хотя бы, с чего начать? Или может у кого-то есть уже готовая, поделитесь, если не жалко..

Добавлено через 2 часа 55 минут
Ну что, никто не может подсказать чтоли?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2013, 18:01     Метод конечных разностей для краевой задачи
Посмотрите здесь:

Метод конечных элементов C++
C++ решение краевой задачи для диф. уравнения методом сеток
C++ Нахождение конечных разностей в с++
Метод Конечных Разностей для уравнения в частных производных C++
C++ метод конечных элементов на си++
C++ составить программу для вычисления конечных сумм а и добутков в
C++ Составить программу для вычисления конечных сумм а и произведение b
C++ Метод конечных автоматов для списка слов

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
manyak666
0 / 0 / 0
Регистрация: 26.03.2013
Сообщений: 7
07.06.2013, 20:40  [ТС]     Метод конечных разностей для краевой задачи #2
В общем нашлась готовая программа на делфи в виде приложения с интерфейсом. Вместе с другом-программистом перепилили её на С++ в борланде, после двух недель страдания она заработала. Теперь нужно её переделать в обычное консольное приложение, и чтобы работало в Visual C++, ибо разбираться с борландом - это для меня ещё одна трудно преодолимая проблема (борланд стоял у коллеги). В итоге у нас чё-то получилось, но оно коряво работает и выдаёт полную ерунду. Помогите, пожалуйста, разобраться и исправить ошибки.
Вот наше "творчество":

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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#pragma hdrstop
#include <stdio.h>
#include <conio.h>
 
const int N = 10;
const int M = 30;
double eps = 0.001;
double F0[N][M], F[N][M], Xl[N];
 
void exchange(double **mas, int razmer,int from, int to){
for(int i=0; i < razmer; i++){
mas[from][i] = mas[from][i] + mas[to][i];
mas[to][i] = mas[from][i] - mas[to][i];
mas[from][i] = mas[from][i] - mas[to][i];
}
}
 
// определяем ближайшую строку с не 0 диоганалью вниз
int get_n_no_empty(double **a, int razmer, int begin){
for(int i=begin+1; i < razmer; i++){
if(a[i][i] != 0){
return i;
}
}
}
 
double *Gauss(double **a, double *b)
{
int razmer; //размер матрицы
double *x;
 
/* Здесь переменной razmer необходимо присвоить размер матрицы */
// создание динамических переменных
/* Здесь нам надо присвоить значения матрице а, и заполнить свободные члены b */
 
// прямой проход
// идем слево на право по коэфицентам х
for(int k=0; k < razmer-1; k++){
// вычитаем по строкам
for(int m=k+1; m < razmer; m++){
// если на диагонали элемент = 0, то поменяем местами строки
if(a[m][m] == 0) exchange(a, razmer, m, get_n_no_empty(a, razmer, m));
 
double koeficent=a[m][k]/a[0][k];
//вычисление новых коэфицентов уравнения
b[m] = b[m] - b[0] * koeficent;
for(int z=0; z < razmer; z++){
a[m][z] = a[m][k] - a[0][k] * koeficent;
}
 
}
}
// ищем решения
for(int m=razmer-1; m >= 0; m--){
double sum=0;
// идем по строке спаво налево, считая сумму корень*коэфицент, до текущего корня
for(int i=razmer-1; i > m; i--){
sum += x[i] * a[m][i];
}
x[m] = (b[m] - sum)/a[m][m];
}
 
// вывод решений
// cout « "###Решения:" « endl;
return x;
}
 
double Fn(double t)
{
double x = t*t-1;
return x;
}
 
void progon(double E[N][M], double D[N])
{
int i;
// double znam;
double a[N],b[N],c[N],f[N],alpha[N],beta[N];
// int nn;
double X[N];
// double G[N][M];
 
for (i=0;i<=N;i++)
{
a[i] = E[i+1][i];
c[i] = E[i][i];
b[i] = E[i-1][i];
}
for (i=0;i<=N;i++)
{
f[i] = D[i];
}
c[0] = 1;
c[N] = 1;
alpha[0] = 1;
beta[0] = 0;
for (i=1;i<=N-1;i++)
{
alpha[i+1] = b[i]/(c[i]-a[i]*alpha[i]);
beta[i+1] = (a[i]*beta[i] + f[i])/(c[i]-a[i]*alpha[i]);
}
for (i=N-1;i>=0;i--)
{
X[i] = alpha[i+1]*X[i+1] + beta[i+1];
}
for (i=0;i<=N;i++)
{
Xl[i] = X[i];
}
}
 
void main(){
 
int i,j,k;
double h,tau;
double a,b,Xi,Tj,a1;
double E[N][M];
double D[N],*Ms;
 
a = 0; b = 1;
h = (b-a)/N;
tau = h/2;
for (i=1;i<=M;i++)
{
F[0][i] = 0.01;
F[N][i] = 0;
}
for (j=0;j<=N;j++)
{
F[j][0] = 0.01*(1-j*h);
}
 
for (j=1;j<=M;j++)
{
E[0][0] = 0;
E[0][1] = 1;
E[N][N] = 1;
E[N-1][N] = 0;
D[0] = 0.01;
D[N] = 0;
for (i=1;i<=N-1;i++)
{
Xi = i*h;
Tj = tau*j;
a1 = 3.3-1.5*Xi;
E[i-1][i] = -(a1*a1)/(2*h*h);
E[i][i] = 1/tau + (a1*a1)/(h*h);
E[i+1][i] = -(a1*a1)/(2*h*h);
D[i] = Fn(Tj) + (a1*a1)/(2*h*h)*F[i+1][j] + (1/tau - (a1*a1)/(h*h))*F[i][j] + (a1*a1)/(2*h*h)*F[i-1][j];
}
// Ms = Gauss(E,D);
progon(E,D);
for (k = 1;k<=N-1;k++)
{
F[k][j] = Xl[k];
}
 
for (i=0;i<=N;i++)
{
for (j=0;j<=M;j++)
{
printf("\n%f", F[i][j]);
 
}
}
 
}
getch();
}
Yandex
Объявления
07.06.2013, 20:40     Метод конечных разностей для краевой задачи
Ответ Создать тему
Опции темы

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