PDE

Форум пользователей пакета Mathematica

Модератор: Admin

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

PDE

Сообщение Andrey » Ср июн 01, 2011 6:26 am

Друзья! Не могу понять: такое уравнение вообще не решается, или просто Математика его не решает? Или я чего записал не правильно?
Это уравнение теплопроводности

Код: Выделить всё

a = 0.1; b=0.2;
pde = D[u[t, x], t] == a D[u[t, x], {x, 2}]
ic = u[0, x] == Tanh[100 x]
bc0 = u[t, 0] == 0
bc1 = b D[u[t, x], x] == D[u[t, x], t] /. x -> 1
pds = {pde, bc0, bc1, ic};
sol = NDSolve[pds, u, {x, 0, 1}, {t, 0, 1}]

Ругается, что в граничном условии порядок производной должен быть меньше, чем в самом уравнении.

kypakaman
Сообщения: 31
Зарегистрирован: Пн май 16, 2011 9:42 pm

Сообщение kypakaman » Ср июн 01, 2011 7:38 am

уравнение просто криво составлено вот и не решает....
и да -в граничном условии порядок производной должен быть меньше, чем в самом уравнении.

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

Сообщение Andrey » Ср июн 01, 2011 8:43 am

kypakaman писал(а):уравнение просто криво составлено вот и не решает....

А можно чуть подробнее. Не подскажите, как его "прямо" составить?

kypakaman писал(а):и да -в граничном условии порядок производной должен быть меньше, чем в самом уравнении.

А вот это не понятно. Кому должен? Даже тупая явная разностная схема работает нормально. Это такое ограничение Математики, или есть какой-то более глубокий смысл?

kypakaman
Сообщения: 31
Зарегистрирован: Пн май 16, 2011 9:42 pm

Сообщение kypakaman » Ср июн 01, 2011 3:37 pm

А можно чуть подробнее. Не подскажите, как его "прямо" составить?

читайте соответствующую литературу...
Это такое ограничение Математики, или есть какой-то более глубокий смысл?

математика это считать не будет...
быть может вы в другом матпакете сможете это посчитать?
было бы интересно узнать...

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

Сообщение Andrey » Ср июн 01, 2011 4:32 pm

kypakaman писал(а):читайте соответствующую литературу...

Исчерпывающий ответ - можно присобачить к любому вопросу. Только я не увидел, где там чего "криво". Синтаксически все правильно и при b -> Infinity все считается замечательно.

kypakaman писал(а):математика это считать не будет...
быть может вы в другом матпакете сможете это посчитать?
было бы интересно узнать...

Дык не то, что не будет, а не считает. Основной вопрос - почему не считает? Это Математика не понимает таких граничных, или это вообще запрещено?

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

Сообщение Andrey » Ср июн 01, 2011 5:08 pm

Еще одна забавная штука:

Код: Выделить всё

a = 0.1;
pde = D[u[t, x], t] == a D[u[t, x], {x, 2}]
ic = u[0, x] == Tanh[100 x]
bc0 = u[t, 0] == 0
bc1 = u[t, 1] == 1 - 0.1 t
pds = {pde, bc0, bc1, ic};
sol = NDSolve[pds, u, {x, 0, 1}, {t, 0, 1}]

нормально считает.
А вот так:

Код: Выделить всё

a = 0.1;
pde = D[u[t, x], t] == a D[u[t, x], {x, 2}]
ic = u[0, x] == Tanh[100 x]
bc0 = u[t, 0] == 0
bc1 = -0.1 == D[u[t, x], t] /. x -> 1
pds = {pde, bc0, bc1, ic};
sol = NDSolve[pds, u, {x, 0, 1}, {t, 0, 1}]

не считает, ругается ровно теми же словами.

kypakaman
Сообщения: 31
Зарегистрирован: Пн май 16, 2011 9:42 pm

Сообщение kypakaman » Ср июн 01, 2011 7:25 pm

ну как она посчитает если вы сначала пишете
D[u[t, x], t] == a D[u[t, x], {x, 2}]
а потом
D[u[t, x], t] /. x -> 1==-0.1
так никак нельзя....

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

Сообщение Andrey » Ср июн 01, 2011 8:02 pm

Нет, не считает, только надо немного по другому:

Код: Выделить всё

(D[u[t, x], t] /. x -> 1)==-0.1
иначе идет замена x на 1==-0.1, т.е. на False. Тут от перестановки мест ничего не меняется. Вот так:

Код: Выделить всё

bc1 = 1 - 0.1 t == u[t, 1]
все нормально считает. Похоже этот алгоритм еще на входе отслеживает порядок производных в диффуре и просматривает граничные на предмет порядка опять же производных.

kypakaman
Сообщения: 31
Зарегистрирован: Пн май 16, 2011 9:42 pm

Сообщение kypakaman » Ср июн 01, 2011 8:21 pm

так да она на это собственно и ругалась...

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

Сообщение Andrey » Ср июн 01, 2011 8:36 pm

kypakaman писал(а):так да она на это собственно и ругалась...

Ну да! А вот почему? Метод не подходящий? Можно ли заменить? Хотя странно, вот самая примитивная разностная схема:

Код: Выделить всё

a=0.2;b=-0.2;
nx=50;nt=1000;
dx=1/nx;dt=1/nt;
X=Table[x,{x,0,1,1/nx}];
U=Array[u,{nt+1,nx+1}];
U[[1]]=Table[Tanh[100 X[[i]]],{i,nx+1}]//N;
Do[U[[i,1]]=0;
U[[i,nx+1]]=U[[i-1,nx+1]]+dt b (U[[i-1,nx+1]]-U[[i-1,nx]])/dx;
U[[i,j]]=U[[i-1,j]]+(a dt (U[[i-1,j-1]]+U[[i-1,j+1]]-2 U[[i-1,j]]))/dx^2,
{i,2,nt+1},{j,2,nx}]
ListPlot[Transpose[U][[nx+1]]]
ListPlot3D[U,PlotRange->All]
на скору руку накидал. Схема считает, медленно, но считает, значит можно же такое посчитать.

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

Сообщение Andrey » Ср июн 01, 2011 9:13 pm

Похоже придумал (к вопросу о пользе курения). Для случая (D[u[t, x], t] /. x -> 1)==-0.1 ввести еще одну функцию v[t, x] и заменить это условие на u[t, 1] == v[t, 1]:

Код: Выделить всё

a = 0.1;
pde1 = D[u[t, x], t] == a D[u[t, x], {x, 2}]
pde2 = D[v[t, x], t] == -0.1
ac = v[0, x] == 1
ic = u[0, x] == Tanh[100 x]
bc0 = u[t, 0] == 0
bc1 = u[t, 1] == v[t, 1];
pds = {pde1, pde2, bc0, bc1, ic, ac};
sol = NDSolve[pds, {u, v}, {x, 0, 1}, {t, 0, 1}];

Plot3D[Evaluate[u[t, x] /. First[sol]], {t, 0, 1}, {x, 0, 1},
 PlotRange -> All]

nf = u /. First[sol]
eq = D[nf[t, x], t] - a D[nf[t, x], {x, 2}]
Plot3D[Evaluate[eq], {t, 0, 1}, {x, 0, 1}, PlotRange -> All]


Почти как гланды автогеном через ..., но вроде работает

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

Сообщение Andrey » Ср июн 01, 2011 9:29 pm

Код: Выделить всё

a = 0.1; b = -0.1;
pde1 = D[u[t, x], t] == a D[u[t, x], {x, 2}]
pde2 = D[v[t, x], t] == b (D[u[t, x], x] /. x -> 1)
ac = v[0, x] == 1
ic = u[0, x] == Tanh[100 x]
bc0 = u[t, 0] == 0
bc1 = u[t, 1] == v[t, 1]
pds = {pde1, pde2, bc0, bc1, ic, ac};
sol = NDSolve[pds, {u, v}, {x, 0, 1}, {t, 0, 1}]


Идет ошибка:
NDSolve::rdelay: -- Message text not found -- (t)
Чего бы это означало?

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

Сообщение Andrey » Ср июн 01, 2011 9:53 pm

Все! Готово!

Код: Выделить всё

a=0.1;b=-0.1;
pde1=D[u[t,x],t]==a D[u[t,x],{x,2}]
pde2=D[v[t,x],t]==b D[u[t,x],x]
ac=v[0,x]==1
ic=u[0,x]==Tanh[100x]
bc0=u[t,0]==0
bc1=u[t,1]==v[t,1]
pds={pde1,pde2,bc0,bc1,ic,ac};
sol=NDSolve[pds,{u,v},{x,0,1},{t,0,1}]

Plot3D[Evaluate[u[t,x]/.First[sol]],{t,0,1},{x,0,1},PlotRange->All]

nf=u/.First[sol];
eq=D[nf[t,x],t]-a D[nf[t,x],{x,2}];
Plot3D[Evaluate[eq],{t,0,1},{x,0,1},PlotRange->All]

Plot[Evaluate[{D[nf[t,x],t],b D[nf[t,x],x]}/.x->1],{t,0,1}]


Огромное спасибо за участие! Иногда достаточно просто поговорить с хорошим человеком.

kypakaman
Сообщения: 31
Зарегистрирован: Пн май 16, 2011 9:42 pm

Сообщение kypakaman » Чт июн 02, 2011 1:01 am

тебе тоже спасибо)быть может столкнусь с подобной проблемой - буду знать)