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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.81
manyak666
0 / 0 / 0
Регистрация: 26.03.2013
Сообщений: 7
#1

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

29.05.2013, 18:01. Просмотров 5136. Ответов 1
Метки нет (Все метки)

Помогите пожалуйста. Надо написать программу, которая решает краевую задачу для ОДУ 2 порядка методом конечных разностей. Никак не могу разобраться, подскажите хотя бы, с чего начать? Или может у кого-то есть уже готовая, поделитесь, если не жалко..

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

Метод Конечных Разностей для уравнения в частных производных - C++
Здравствуйте, требуется ваша помощь в нахождении ошибки в программе. Вычисляю по явной схеме. Выдает какие-то очень большие числа. ...

Конечно-разностный метод решения краевой задачи (дифференциального уравнения) - C++
Решить краевую задачу конечно-разностным методом, условие в приложенных скриншотах и pdf-файле. Вместо правильного решения выводит...

Нахождение конечных разностей в с++ - C++
Очень нужна помощь, недавно начала осваивать с++, нужно написать программу, которая вычисляет конечные разности, вот мой код, не могу...

Используя таблицу конечных разностей, определить значение 1 и 2-ой производной - C++
1. Используя таблицу конечных разностей, определить значение 1 и 2-ой производной в точках Х=Х0, Х=Х0+0,5h, X=X10-0,5h, X=X10, используя...

Решение краевой задачи для дифференциального уравнения методом сеток - C++
Мне в университете задали данную программу написать. но к сожалению на паре мы не успели пройти этот метод. не могу найти точный пример...

Метод конечных автоматов для списка слов - C++
Дан список слов X1, X2, …, Xk и строка Y длины n. Определить, входит ли одно из слов Xi в строку Y как подстрока за время C∙n (где C –...

1
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();
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2013, 20:40
Привет! Вот еще темы с ответами:

Решение краевой задачи на собственные значения методом Галеркина - C++
Помогите пожалуйста реализовать эту задачу, буду очень благодарна! Очень нужно

метод конечных элементов на си++ - C++
Всем привет!нужно написатьт прогу для решения одномерной задачи методом конечных элементов. в чем ошибка? int _tmain(){ setlocale (...

Метод конечных элементов - C++
Помогите с алгоритмами по программированию МКЭ. С математическими основами метода я разобрался, но не могу понять с чего начать...

Метод конечных элементов - ищу баг - C++
Всем привет, конкретно застрял на вычислении матрицы жесткости (пока для одного элемента) из этой статьи...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru