2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2, 3, 4  След.
 
 Помогите пожалуйста написать программу
Сообщение30.01.2014, 15:36 
Аватара пользователя
Всем добрый вечер.
$$
\dfrac{\partial u}{\partial t}=\dfrac{\partial^{2} u}{\partial x^{2}}
$$
$$
\dfrac{u_{1}^{j+1}-u_{i}^{j}}{\tau}=\dfrac{u_{i+1}^{j}-2u_{i}^{j}+u_{i-1}^{j}}{h^{2}}
$$
$$
u_{1}^{j+1}=u_{i}^{j}+\dfrac{\tau}{h^{2}}(u_{i+1}^{j}-2u_{i}^{j}+u_{i-1}^{j}{h^{2}})
$$
\begin{align*}
& x_{i}=i\cdot h, \quad i=0,1,\ldots,N=20, \quad h=\dfrac{1}{20}=0,005\\
& t_{j}=j\cdot h, \quad i=0,1,\ldots,M=50, \quad \tau=\dfrac{T}{50}=\dfrac{10}{50}=0,2\\
\end{align*}
\begin{align*}
&j=0: \quad u_{i}^{1}= u_{i}^{0}+\dfrac{\tau}{h^{2}}(u_{i+1}^{0}-2u_{i}^{0}+u_{i-1}^{0})\\
& i=1,\ldots, N-1\\
&j=1: \quad u_{i}^{2}=u_{i}^{1}+\dfrac{\tau}{h^{2}}(u_{i+1}^{1}-2u_{i}^{1}+u_{i-1}^{1})\\
& i=1,\ldots, N-1\\
&\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\\
\end{align*}

Вот программа но график не получается дает ошибку
Код:
procedure TForm1.Button1Click(Sender: TObject);
var   u: array [0..20,0..50] of real;
       h,tay:real;
       i,j:integer;
begin
h:=0.05;
tay:=0.25;
  for j:=0 to 50 do u[0,j]:=0;
  for j:=0 to 50 do
  u[1,j]:=0;
  for j:=0 to 50 do
  begin
     for i:=1 to 20 do
     begin
     u[i,j+1]:=u[i,j]+(tay)/(sqr(h))*(u[i+1,j]-2*u[i,j]+u[i-1,j]);
     Memo1.Lines.Add('u('+inttostr(i)+ ','+ IntToStr(j)+  ')=' +FloatToStr(u[i,j+1]));

     end;
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);

var   u: array [0..10,0..30] of real;
       h,tay:real;
       i,j:integer;
begin
h:=0.05;
tay:=0.25;
  form2.Chart1.Series[0].Clear;
  for j:=0 to 30 do u[0,j]:=0;
  for j:=0 to 30 do
  u[1,j]:=0;
  for j:=0 to 30 do
  begin
     for i:=1 to 10 do
     begin
     u[i,j+1]:=u[i,j]+(tay)/(sqr(h))*(u[i+1,j]-2*u[i,j]+u[i-1,j]);
    // Memo1.Lines.Add('u('+inttostr(i)+ ','+ IntToStr(j)+  ')=' +FloatToStr(u[i,j+1]));
     //   FGRAF.Chart1.SeriesList[0].AddY(2,'DSDSDS');// .`  :='SDSD';
  WITH FORM2 DO
  BEGIN
  //   Chart1.Series[0].Add(u[i,j+1],'',clred);
     Chart1.Series[0].Add(u[i,j+1],'',clred);


  END;

     end;
  end;
  FORM2.ShowModal;
end;

end.

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение30.01.2014, 17:35 
Аватара пользователя
 i  Тема перемещена в Карантин.

Писать программы здесь за Вас никто не будет, могут только помочь при возникновении конкретных затруднений. Приведите свои варианты программ и объясните, что не получается.

После того как исправите сообщение, сообщите об этом в теме Сообщение в карантине исправлено.

 
 
 
 Posted automatically
Сообщение31.01.2014, 16:43 
Аватара пользователя
 i  Тема перемещена из форума «Карантин» в форум «Программирование»
вернул

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение31.01.2014, 17:35 
Аватара пользователя
Кто может сказать почему на график дает ошибку?

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение31.01.2014, 19:27 
Есть такая штука - называется отладка. Если вы сами писали эту программу - это не составит никакого труда. Раз вы сами всё это написали - вы же понимаете для чего каждая строчка и каждый оператор. Вы сами их туда зачем-то вставили.

Вставляете в проблемное место программы любую фигню, которая позволяет произвести останов программы до нажатия кнопки и вывод на экран:


Код:
//QMessageBox msgBox;
//msgBox.setText("error");
//msgBox.exec();



И смотрите сами, что где работает не так.

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение31.01.2014, 19:36 
Аватара пользователя
Ещё до написания программы давайте разберёмся, что Вы хотите запрограммировать.
Maik2013 в сообщении #820698 писал(а):
$\dfrac{\partial u}{\partial t}=\dfrac{\partial^{2} u}{\partial x^{2}}$
Это понятно. Одномерное однородное уравнение теплопроводности.
1) Должен быть ещё коэффициент: $u_t=a u_{xx}$. Вы его не потеряли? Его можно сделать единичным с помощью замены переменных, но Вы её делали?

Maik2013 в сообщении #820698 писал(а):
$\dfrac{u_{1}^{j+1}-u_{i}^{j}}{\tau}=\dfrac{u_{i+1}^{j}-2u_{i}^{j}+u_{i-1}^{j}}{h^{2}}$
2) В левой части исправьте $u_{1}^{j+1}$ на $u_{i}^{j+1}$.
3) Огромная просьба: везде (и в программе тоже) замените $j$ (номер шага по $t$) на $k$. Буквы $i$ и $j$ плохо различимы.

Maik2013 в сообщении #820698 писал(а):
$u_{1}^{j+1}=u_{i}^{j}+\dfrac{\tau}{h^{2}}(u_{i+1}^{j}-2u_{i}^{j}+u_{i-1}^{j}{h^{2}})$
4) Откуда в скобках $h^2$ ?
5) В левой части исправьте $u_{1}^{j+1}$ на $u_{i}^{j+1}$.

Будем считать, что Вы написали формулу правильно:
$u_{i}^{j+1}=u_{i}^{j}+\dfrac{\tau}{h^{2}}(u_{i+1}^{j}-2u_{i}^{j}+u_{i-1}^{j})$
Всё равно вопросы:
6) Очень важно. По какой формуле вычисляются краевые значения $u_{0}^{j+1}$ (неоткуда взять $u_{i-1}^{j}$ в правой части) и $u_{N}^{j+1}$ (неоткуда взять $u_{i+1}^{j}$ в правой части) ?
7) Ещё важнее. Как задаются начальные значения $u_i^0$ ? Способ в Вашей программе (всё равно нулю) неправильный. Так мы вообще для всех $u_{i}^{j}$ будем получать только нули.

Maik2013 в сообщении #820698 писал(а):
$x_{i}=i\cdot h, \quad i=0,1,\ldots,N=20, \quad h=\dfrac{1}{20}=0,005$
8) Разве $\dfrac{1}{20}=0,005$ ?

Maik2013 в сообщении #820698 писал(а):
$t_{j}=j\cdot h, \quad i=0,1,\ldots,M=50, \quad \tau=\dfrac{T}{50}=\dfrac{10}{50}=0,2$
9) Не $t_{j}=j\cdot h$, а $t_{j}=j\cdot \tau$.
10) Не $i=0,1,\ldots,M$, а $j=0,1,\ldots,M$.

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение01.02.2014, 06:38 
Аватара пользователя
Alexu007
Спасибо за то, что ответили но эта программу не я написал написать программу один приятель помог и у него не
было время сказал что, далее сам разбирайся, сам не много капал но не смог и туда обращался.

svv
Огромный спасибо Вам за такую подробность и замечание. Могу привести аналитический решение может от туда
понятно будет как получился начальные значения $u_{i}^{0} $
$$
\dfrac{\partial u}{\partial t}=\dfrac{\partial^{2}u}{\partial x^{2}}
$$
\begin{align*}
&u(0,t)=0, \quad 0\leq t\leq T\\
&u(1,t)=0,\\
&u(x,0)=\sqrt{2}\sin\pi x, \quad 0\leq x\leq 1.\\
&u^{T}=\sqrt{2}e^{-\pi^{2}t}\sin\pi x\\
\end{align*}

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение01.02.2014, 07:30 
Maik2013 в сообщении #820698 писал(а):
Код:
for j:=0 to 50 do
u[1,j]:=0;

При чём тут единица-то?

Maik2013 в сообщении #820698 писал(а):
Код:
for i:=1 to 20 do


Почему до двадцати-то?

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение01.02.2014, 08:37 
Аватара пользователя
ewert
Я сам проста написал от 1 до 20 можно меньше и больше

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение01.02.2014, 08:44 
Maik2013 в сообщении #821368 писал(а):
Я сам проста написал от 1 до 20 можно меньше и больше

Т.е. от балды? Больше-то уж никак нельзя (даже 20 нельзя) -- вылетите за пределы массива.

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение01.02.2014, 08:54 
Аватара пользователя
ewert
Знайте Вы почему на график дает ошибку?

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение01.02.2014, 09:13 
Не знаю, я в дельфях не разбираюсь. Но на две явных ошибки я Вам указал, и если первая может к фатальным последствиям и не привести (там граничные условия могут инициализироваться и сами просто при запуске программы), то вторая приведёт почти наверняка. И вообще использование границ массивов в численном виде неграмотно -- их надо объявлять как константы и обращаться к ним по имени.

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение01.02.2014, 09:20 
Аватара пользователя
ewert
При решение числовых не дает ошибку а при рисование графиков дает ошибку
Код:

u(1,0)=5,96804419803112E262
u(2,0)=-1,18764079540819E263
u(3,0)=5,96804419803112E262
u(4,0)=2,62252275314161E-306
u(5,0)=1,17739006702191E-310
u(6,0)=3,47715686908558E-306
u(7,0)=-6,919891842984E-306
u(8,0)=7,11904361829397E-306
u(9,0)=-3,55755029601415E-306
u(10,0)=-3,7001269839441E-306
u(11,0)=6,08048333778748E262
u(12,0)=-1,21001618421971E263
u(13,0)=6,08048333778748E262
u(14,0)=NAN
u(15,0)=NAN
u(16,0)=NAN
u(17,0)=-2,6072455885109E-306
u(18,0)=2,63321033865079E-306
u(19,0)=4,66847663477011E-311
u(20,0)=2,61929090306911E-306
u(1,1)=-2,37528159081638E265
u(2,1)=3,55701402246853E265
u(3,1)=-2,37528159081638E265
u(4,1)=5,96804419803112E264
u(5,1)=6,09944532160386E-304
u(6,1)=-1,38393162734576E-303
u(7,1)=2,43667852549177E-303
u(8,1)=-2,46443389394032E-303
u(9,1)=1,0498441723418E-303
u(10,1)=6,08048333778748E264
u(11,1)=-2,42003236843942E265
u(12,1)=3,62402887415472E265
u(13,1)=NAN
u(14,1)=NAN
u(15,1)=NAN
u(16,1)=NAN
u(17,1)=NAN
u(18,1)=-7,84728747765963E-304
u(19,1)=5,25240833903487E-304
u(20,1)=25
u(1,2)=8,28382438819313E267
u(2,2)=-1,18290210863451E268
u(3,2)=8,88062880799624E267
u(4,2)=-3,56292238622458E267
u(5,2)=5,96804419803112E266
u(6,2)=5,80064699607022E-301
u(7,2)=-8,6973557870147E-301
u(8,2)=8,3907461467748E-301
u(9,2)=6,08048333778748E266
u(10,2)=-3,63004855265913E267
u(11,2)=9,04794162112791E267
u(12,2)=NAN
u(13,2)=NAN
u(14,2)=NAN
u(15,2)=NAN
u(16,2)=NAN
u(17,2)=NAN
u(18,2)=NAN
u(19,2)=2500
u(20,2)=-4970
u(1,3)=-2,83138316188495E270
u(2,3)=4,07042051580162E270
u(3,3)=-3,30643948004822E270
u(4,3)=1,65676487763863E270
u(5,3)=-4,75056318163277E269
u(6,3)=5,96804419803112E268
u(7,3)=3,14991311590043E-298
u(8,3)=6,08048333778748E268
u(9,3)=-4,84006473687883E269
u(10,3)=1,68797865746983E270
u(11,3)=NAN
u(12,3)=NAN
u(13,3)=NAN
u(14,3)=NAN
u(15,3)=NAN
u(16,3)=NAN
u(17,3)=NAN
u(18,3)=NAN
u(19,3)=NAN
u(20,3)=1239030
u(1,4)=9,70487300795266E272
u(2,4)=-1,42379594683784E273
u(3,4)=1,23069999587362E273
u(4,4)=-7,07845790471236E272
....................................

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение01.02.2014, 09:33 
Maik2013 в сообщении #821378 писал(а):
u(1,0)=5,96804419803112E262
u(2,0)=-1,18764079540819E263
u(3,0)=5,96804419803112E262
u(4,0)=2,62252275314161E-306
u(5,0)=1,17739006702191E-310
u(6,0)=3,47715686908558E-306
u(7,0)=-6,919891842984E-306
u(8,0)=7,11904361829397E-306
u(9,0)=-3,55755029601415E-306
u(10,0)=-3,7001269839441E-306
u(11,0)=6,08048333778748E262
u(12,0)=-1,21001618421971E263
u(13,0)=6,08048333778748E262
u(14,0)=NAN
u(15,0)=NAN
u(16,0)=NAN
u(17,0)=-2,6072455885109E-306
u(18,0)=2,63321033865079E-306
u(19,0)=4,66847663477011E-311
u(20,0)=2,61929090306911E-306

Это означает, что у Вас не инициализировано начальное условие. И оно действительно в тексте программы нигде не задаётся.

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение01.02.2014, 09:51 
Аватара пользователя
ewert
Что мне делать покажи пожалуйста на пальцах пожалуйста

 
 
 [ Сообщений: 48 ]  На страницу 1, 2, 3, 4  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group