Оператор Лапласа

migel

Подскажите пожалуйста где можно найти про то как решать задачу для оператора Лапласа в прямоугольнике? (даны краевые условия)
Мне надо написать прогу которая это делает..
Или может у кого-нибудь есть уже готовое что-то похожее?...
Вроде я слышал на м\м такое пишут на 4м курсе..

maslyan

тут есть:
Боголюбов А.Н., Кравцов В.В. Задачи по математической физике. М: Изд-во МГУ, 1998.
(книга для 3 курса физфака, курс мат. методов в физике)

SvinkaVJeansah

Самарского книги глянь. Название не помню

Tasha2201

Самарский "Численные Методы Мат. Физики."
, например

migel

Спасибо за книжки!
Если прогу не найду, придется читать и писать...
..А может все-таки у кого-то таки завалялась програмка?

lord2476

курсавая на 3ом курсе фф по твоей теме.
но у большинства было в круге

migel

да без разницы где!
мне бы хоть какую-нибудь, там уж я переделаю..

mama10001

В прямоугольнике оно решается явным методом с помощью FFT,
а в цилиндре гармоники Лапласа не синусы, а функции Бесселя, с которыми х что поделаешь

olegusmaximus

ну у меня есть
только за правильность
не ручаюсь хотя ошибок не видел еще
кстати C#

migel

Подскажите плз кто-нибудь какие-нибудь хорошие ф-ции для граничных условий, чтобы получалось разумное решение! (чтобы на них можно было прогу протестить)

mama10001

Подставляешь любую функцию в уравнения, получаешь правую часть. Решаешь уравнение с этой правой частью
Только в пробной функции должны присутствовать как старшие, так и младшие гармоники Лапласа, т.к. одни методы хорошо сходятся на младших, другие – на старших

bleyman

Ужос ужос. Никто так внятно и не ответил.
Так вот, мега явный метод.

Два квадратных массива, U и Ut. На очередном шаге вначале считается внутренность Ut как Ut[i][j] =
(U[i - 1][j] - 2 * U[i][j] + U[i + 1][j]) / (hx*hx) +
(U[i][j - 1] - 2 * U[i][j] + U[i][j + 1]) / (hy*hy)


Потом считаются новые значения U[i][j] = U[i][j] + Ut[i][j] * dt (опять таки для внутренних точек прямоугольника (кстати форма фигуры может быть произвольной.
Потом для внешних точек подставляется краевое условие.

Это было для кр.усл. первого рода. Для второго - всё немного сложнее. Для третьего - хз.
Метод сходится если dt < h*h, кажется. Точно не помню.

olegusmaximus

я думаю задача ставится так

dU=-f,
U(x,a)=s1(x);
U(x,b)=s2(x);
U(c,y)=s3(y);
U(d,y)=s4(y);
//d-оператор Лапласа
то есть она стационарная и никакого dt там нет
вот решение методом переменных направлений

пусть dU=L1(U)+L2(U)

сначала решается методом прогонки(по i) уравнение по
первому направлению для каждого j:
{U^(k+1/2)|i,j - U^(k)|i,j } / tau1 = L1(U^(k+1/2|i,j + L2(U^(k|i,j + f|i,j
j=1..N2-1

потом прогонка(по j) по второму для каждого i:
{U^(k+1)|i,j - U^(k+1/2)|i,j} / tau2 = L1(U^(k+1/2|i,j + L2(U^(k+1|i,j + f|i,j
i=1..N1

L1 и L2 - разностные операторы второго порядка
L1(U)|i,j = {U|i-1,j - 2U|i,j + U|i+1,j} / (dx1 * dx1)
L2(U)|i,j = {U|i,j-1 - 2U|i,j + U|i,j+1} / (dx2 * dx2)

k-номер итерации
повторять до нужной точности
tau1, tau2 -параметры
сходится при всех tau1>0 tau2>0

olegusmaximus

кстати откуда ты сначала собрался взять U|i,j ?
в етом ведь как раз и состоит задача

bleyman

А. Тут типа речь о laplas(U) = 0, да? Я типа писал решение для нестационарной задачи вида
dU/dt = laplas(U). Типа уравнение колебаний мембраны.

olegusmaximus

да кстати чо то автор не написал чо за уравниние у него
ЗЫ ур-ние колебаний d^2U/(dt)^2=laplas(U)
у тебя теплопроводность

bleyman

=) точно. А я ещё думал, зачем же мне массив Ut =) Если чуть-чуть подпадчить формулы, то получатся колебания, вот!

migel

Спасибо всем большое за помощь!
п.с. Мне тут принесли прогу с решением, вроде работает, не могли бы вы подсказать что это за метод в ней? Когда он сходится и т.п.?
 
int solute
{
int i, j;
double *tmp;

// [a, c] x [b, d]
// a----c
// | |
// b----d
double a = 0;
double b = 0;
double c = 1;
double d = 1;

double h = 0.01;
double eps = 0.01;

N1 = (intc - a)/h + 2;
N2 = (intd - b)/h + 2;

u = (double*)malloc(N1*N2*sizeof(double;
next_u = (double*)malloc(N1*N2*sizeof(double;

for (i = 0; i < N2; i++)
for (j = 0; j < N1; j++)
u[i*N1 + j] = next_u[i*N1 + j] = 0;

for (j = 0; j < N1; j++) {
u[j] = next_u[j] = psi3(a + h*j);
u[(N2-1)*N1 + j] = next_u[(N2-1)*N1 + j] = psi4(a + h*j);
}
for (i = 0; i < N2; i++) {
u[i*N1] = next_u[i*N1] = psi1(b + h*i);
u[i*N1 + (N1-1)] = next_u[i*N1 + (N1-1)] = psi2(b + h*i);
}

while (1) {
for (i = 1; i < N2-1; i++)
for (j = 1; j < N1-1; j++)
next_u[i*N1 + j] = 0.25*(u[(i-1)*N1 + j] + u[(i+1)*N1 + j]
+ u[i*N1 + (j-1)] + u[i*N1 + (j+1)] - h*h*f(a + h*j, b + h*i;

tmp = u;
u = next_u;
next_u = tmp;

if (norm(u, next_u) < eps*eps)
break;
}

return 0;
}

migel

уравнение стационарное (так это кажется называется когда не времени:) однородное.
dU=0 c данными граничными условиями

olegusmaximus

не знаю чо за метод
но он явный а значит сходимость у него так себе
вообще итерационные методы выглядят так
B{U^(k+1)-U^(k)}/tau+AU^(k)=f
B,A - матрицы причем AU=f
tau - bnthfw gfhfvtnh
а то что в программе у тя не подходит под описание ето

lexalevy

Какие все умные, бля!
Это метод Якоби, Аркадий.
И прошу Вас, не могли бы вы включить в текст, выкладываемый на форуме, лицензионное соглашение, подписанное Вами в момент принятия программы (внутрь).
Да, я Батор, да, я самый блять умный.

migel

Сорри, забыл..
исправляюсь:
***************
*Олег Андреев (с)*
***************
great thanks to him.
п.с. Инет стоит, даже не пошатнется

olegusmaximus

вот метод Якоби
U^(k+1)-U^(K)+AU^(k)=f
никак не могу понять как из этого
получается то чо у тя в проге написано
не мог бы объяснить, может я гдето не прав...

olegusmaximus

ok все понял
смотреть здеся самарский гулин стр 137
Оставить комментарий
Имя или ник:
Комментарий: