2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3, 4
 
 Re: Помогите пожалуйста написать программу
Сообщение06.02.2014, 08:42 
Аватара пользователя
svv
Спасибо большой за то, что Вы так мне помогали.
Да я тоже знаю правилу. Исправите пожалуйста мою программу.
код: [ скачать ] [ спрятать ]
Используется синтаксис Delphi
procedure TForm1.Button3Click(Sender: TObject);
var   u: array [0..20,0..50] of real;
       h,tay,x,t1:real;
       i,j,l,n,m,t,sh,ih:integer;
begin
sh:=100;
n:=20;
m:=50;
l:=1;
t:=300;
h:=l/n;
tay:=t/m;
//Инициализация массива
  for i:=0 to n do
  begin
      for j:=0 to m do
      u[i,j]:=0;
  end;
//Конец инициализация массива
  for I:=0 to n do
  begin
    x:=i*h;
    u[I,0]:=sqr(2)*SIN(pi*x);
  end;
for j:=0 to m do u[0,j]:=0 ;
  for j:=0 to m do
  u[n,j]:=0;

  for j:=1 to m do
  begin
//    FORM2.Chart1.Series[0].Add(u[i,j],'',clred);
     for i:=1 to n-1 do
     begin
        u[i,j]:=u[i,j-1]+(tay/sqr(h))*(u[i+1,j-1]-2*u[i,j-1]+u[i-1,j-1]);
        Memo1.Lines.Add('u('+inttostr(i)+ ','+ IntToStr(j)+  ')=' +FloatToStr(u[i,j]));
        WITH FORM2 DO
        BEGIN
          Chart1.Series[0].Add(u[i,j],'',clred);
        END;
      end;
  end;
   form2.ShowModal;

end;
 

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение07.02.2014, 16:48 
Аватара пользователя
svv

Спасибо за все!

 
 
 
 Re: Помогите пожалуйста написать программу
Сообщение07.02.2014, 17:19 
Аватара пользователя
Пожалуйста. Помещу здесь на всякий случай базовый вариант.
код: [ скачать ] [ спрятать ]
Используется синтаксис Delphi
const
  N=10;
  M=400;
  LL=1.;
  TT=1.;
var
  x: array [0..N] of real;
  t: array [0..M] of real;
  u: array [0..N, 0..M] of real;
  v: array [0..N, 0..M] of real;

procedure Calculate;
const
  h=LL/N;
  tau=TT/M;
var
  i, k: integer;
begin
  for i:=0 to N do x[i]:=i*h;
  for k:=0 to M do t[k]:=k*tau;
  for i:=0 to N do u[i,0]:=sqrt(2)*sin(pi*x[i]);
  for k:=1 to M do
  begin
    u[0,k]:=0;
    u[N,k]:=0;
    for i:=1 to N-1 do
      u[i,k]:=u[i,k-1]+tau/sqr(h)*(u[i+1,k-1]-2*u[i,k-1]+u[i-1,k-1]);
    for i:=0 to N do
      v[i,k]:=sqrt(2)*sin(pi*x[i])*exp(-sqr(pi)*t[k]);
  end;
end;

procedure TForm1.Display;
var
  i, k: integer;
begin
  k:=TrackBar1.Position;
  if (k<0) or (k>M) then Exit;
  Label1.Caption:='k='+IntToStr(k);
  Label2.Caption:='t='+FloatToStr(t[k]);
  Series1.Clear;
  Series2.Clear;
  for i:=0 to N do
  begin
    Series1.AddXY(x[i], u[i,k]);
    Series2.AddXY(x[i], v[i,k]);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Calculate;
  TrackBar1.Max:=M;
  Display;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Display;
end;
 


:!: Здесь в массиве $u$ хранятся значения, полученные численным методом, а в массиве $v$ — теоретические значения.

-- Пт фев 07, 2014 16:25:32 --

И ещё. Можете изменить процедуру TForm1.FormCreate на такую:
Используется синтаксис Delphi
procedure TForm1.FormCreate(Sender: TObject);
begin
  Calculate;
  TrackBar1.Max:=M;
  Chart1.LeftAxis.AutomaticMaximum:=false;
  Chart1.LeftAxis.Maximum:=1.5;
  Display;
end;
 

Тогда левая ось графика не будет автоматически изменяться с изменением графика.
Это тоже хорошо. Может, ещё лучше.

Вот неустойчивость метода — это плохо. Вторая численная производная опасна!

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


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