Автор: Пользователь скрыл имя, 18 Декабря 2011 в 11:11, курсовая работа
Методом Фурье решить начальную краевую задачу для волнового уравнения,
в одномерном случае. С условиями: на левом конце – условие Дирихле, на правом конце – условие Неймана.
1. Постановка задачи. Граничные и начальные условия.…………………..………… 2
2. Физический смысл уравнения……………………………………………………….. 2
3. Решение задачи методом Фурье……………………………………………………... 4
4. Результаты численных экспериментов………………………………………….…… 9
5. Листинг программы…………………………………………………………………...
function norm2psi: real;
function residual1: real;
function residual2: real;
function a(k: integer): real;
function b(k: integer): real;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
N: integer;
m: integer;
x: array of real;
alfa: array of real;
beta: array of real;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.Add('~0.2'
ComboBox1.Items.Add('~0.
ComboBox1.Items.Add('~0.
ComboBox1.ItemIndex:=0;
RadioGroup1.Items.Add('
RadioGroup1.Items.Add('
RadioGroup1.ItemIndex:=0;
RadioGroup2.Items.Add('
RadioGroup2.Items.Add('
RadioGroup2.ItemIndex:=0;
end;
// граничные условия
function TForm1.phi(t: real): real;
begin
case RadioGroup1.ItemIndex of
0: result:=exp(t)-1-exp(Pi/2)*t;
1: result:=ln(t+1)-2/(Pi+2)*t;
end;
end;
function TForm1.psi(t: real): real;
begin
case RadioGroup1.ItemIndex of
0: result:=t*t;
1: result:=exp(t)-1;
end;
end;
// приближенное решение и ее производная по времени
function TForm1.v(t: real): real;
var i: integer;
begin
result:=alfa[0]*sin(t);
if m>1 then
for
i:=1 to m-1 do result:=result+alfa[i]*sin((2*
end;
function TForm1.vt(t: real): real;
var i: integer;
begin
result:=beta[0]*sin(t);
if m>1 then
for
i:=1 to m-1 do result:=result+(2*i+1)*beta[i]
end;
//норма в L2(a;b) функции phi(x)
function TForm1.norm1phi: real;
var i: integer;
begin
result:=phi(x[0])*phi(x[0]
for
i:= 1 to N-2 do result:=result+phi(x[i])*phi(
result:=sqrt(result);
end;
//норма в С функции phi(x)
function TForm1.norm2phi: real;
var i: integer;
begin
result:=abs(phi(x[0]));
for i:=1 to N-2 do
if abs(phi(x[i]))>result then result:=abs(phi(x[i]));
end;
//норма в L2(a;b) функции psi(x)
function TForm1.norm1psi: real;
var i: integer;
begin
result:=psi(x[0])*psi(x[0]
for
i:= 1 to N-2 do result:=result+psi(x[i])*psi(
result:=sqrt(result);
end;
//норма в С функции psi(x)
function TForm1.norm2psi: real;
var i: integer;
begin
result:=abs(psi(x[0]));
for i:=1 to N-2 do
if abs(psi(x[i]))>result then result:=abs(psi(x[i]));
end;
//------------------------
function TForm1.r1phi: real;
var i: integer;
begin
result:=Power(phi(x[0])-v(
for
i:=1 to N-2 do result:=result+Power(phi(x[i])
result:=sqrt(result);
end;
function TForm1.r1psi: real;
var i: integer;
begin
result:=Power(psi(x[0])-
for
i:=1 to N-2 do result:=result+Power(psi(x[i])
result:=sqrt(result);
end;
//------------------------
function TForm1.r2phi: real;
var i: integer;
begin
result:=abs(phi(x[0])-v(x[
for i:=1 to N-2 do
if abs(phi(x[i])-v(x[i]))>result
then result:=abs(phi(x[i])-v(x[i]))
end;
function TForm1.r2psi: real;
var i: integer;
begin
result:=abs(psi(x[0])-vt(
for i:=1 to N-2 do
if abs(psi(x[i])-vt(x[i]))>result
then result:=abs(psi(x[i])-vt(x[i])
end;
//невязка 1 норма в L
function TForm1.residual1: real;
begin
result:=(r1phi/norm1phi+
end;
//невязка 2 (норма в C[a;b])
function TForm1.residual2: real;
begin
result:=(r2phi/norm2phi+
end;
//вычисление коэф-ов
function TForm1.a(k: integer): real;
var i: integer;
begin
case RadioGroup2.ItemIndex of
0: begin
result:=0;
for i:=0 to N-2 do
result:=result+phi(x[i])*sin((
result:=result*4/Pi;
end;
1: begin
result:=0;
for i:=0 to N-2 do
result:=result+phi(x[i])*(
result:=result*(-4)/(2*k+
end;
end;
end;
function TForm1.b(k: integer): real;
var i: integer;
begin
case RadioGroup2.ItemIndex of
0: begin
result:=0;
for i:=0 to N-2 do
result:=result+psi(x[i])*sin((
result:=result*4/(2*k+1)/Pi;
end;
1: begin
result:=0;
for i:=0 to N-2 do
result:=result+psi(x[i])*(
result:=result*(-4)/(2*k+
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
//
количество узлов разбиения
case ComboBox1.ItemIndex of
0: N:=8;
1: N:=157;
2: N:=1571;
end;
//заполняем массив x[i]
SetLength(x, N);
for i:=0 to N-1 do x[i]:=Pi/2/(N-1)*i;
for i:=0 to N-2 do x[i]:=(x[i+1]+x[i])/2;
//заполняем массив alfa[i] и beta[i]
SetLength(alfa, 101);
for
i:=0 to 100 do alfa[i]:=a(i);
SetLength(beta, 101);
for i:=0 to 100 do beta[i]:=b(i);
//
на график
Chart1.Series[0].Clear;
Chart1.Series[1].Clear;
for i:=1 to 100 do begin //кол-во слагаемых
m:=i;
Chart1.Series[0].Add(
Chart1.Series[1].Add(
end;
{m:=70;
for i:=0 to 157 do begin
Chart1.Series[0].Add(psi(i/
Chart1.Series[1].Add(vt(i/100)
end;}
for i:=0 to 10 do Memo1.Lines.Add('');
for
i:=0 to 10 do Memo1.Lines[i]:='a'+IntToStr(
for i:=0 to 10 do Memo2.Lines.Add('');
for
i:=0 to 10 do Memo2.Lines[i]:='b'+IntToStr(
Edit1.Text:=FloatToStr(
Edit2.Text:=FloatToStr(
Edit3.Text:=FloatToStr(
Edit4.Text:=FloatToStr(
Edit5.Text:=FloatToStr(
Edit6.Text:=FloatToStr(
end;
end.