Обновлены публикации:
http://atheist4.narod.ru/diffuz.htm
http://atheist4.narod.ru/simplediffuz.htm
Исправлена опечатка.
Хотел решение трансцендентного уравнения искать методом касательных, а не методом деления отрезка пополам. Но погрешность вычислений стала больше, и программа зависает уже при N=1000, при h=1, L=3, DX=1E-8 ,например:
procedure PCoInvoluta;
const
DX=1E-8;
var
h:real;
L:real;
M:real;
K:integer;
W: real;
N: integer;
function Y(X:real):real;
begin
Y:=h*Cos(X*L)/Sin(X*L)-X;
end;
function Z(X:real):real;
begin
Z:=-h*L/Sin(X*L)/Sin(X*L)-1;
end;
begin
h:= StrToFloat(Form1.Edit1.Text);
L:= StrToFloat(Form1.Edit2.Text);
N:= StrToInt(Form1.Edit3.Text);
if Form1.CheckBox1.State = cbChecked
then Form1.Memo1.Visible:=true
else Form1.Memo1.Visible:=false;
Form1.Memo2.Visible:=false;
Form1.Memo3.Visible:=false;
for K:=1 to N do
begin
M:=Pi/4/L;
if Y(Pi*(K-1)/L+M)<=0
then
repeat M:=M/2;
until Y(Pi*(K-1)/L+M)>0;
W:=Pi*(K-1)/L+M;
While Y(W)/(h*L+1)>DX do W:=W-Y(W)/Z(W);
Form1.Memo1.Lines.Add('W('+IntToStr(K)+')='+FloatToStrF(W,ffFixed,20,14));
Form1.Memo2.Lines.Add('d('+IntToStr(K)+')='+FloatToStr(Y(W)));
Form1.Memo3.Lines.Add('f('+IntToStr(K)+')='+FloatToStr(abs(Y(W)/W)));
end;
Form1.Memo1.Lines.Add('Êîðíè óðàâíåíèÿ W=h*ctg(W*L)');
Form1.Memo1.Lines.Add('h='+FloatToStr(h)+' L='+FloatToStr(L));
Form1.Memo1.Visible:=true;
end;
Поэтому оставлю лучше всё, как было - буду искать методом деления отрезка пополам:
procedure PCoInvoluta;
const
DX=1E-30;{погрешность вычисления}
var
h:real;{Значение h}
L:real;{Значение L}
M:real;
K:integer;
I,P: integer;
X1,X2 :real;
W: real;
N: integer;
F: TextFile;
function Y(Z:real):real;
begin
Y:=h*Cos(Z*L)/Sin(Z*L)-Z;
end;
begin
h:= StrToFloat(Form1.Edit1.Text);
L:= StrToFloat(Form1.Edit2.Text);
N:= StrToInt(Form1.Edit3.Text);
if Form1.CheckBox1.State = cbChecked
then Form1.Memo1.Visible:=true
else Form1.Memo1.Visible:=false;
Form1.Memo2.Visible:=false;
Form1.Memo3.Visible:=false;
Form1.Memo1.Lines.Add('Корни уравнения W=h*ctg(W*L)');
Form1.Memo1.Lines.Add('h='+FloatToStr(h)+' L='+FloatToStr(L));
Form1.Memo2.Lines.Add('Абсолютные погрешности:');
Form1.Memo3.Lines.Add('Относитенльные погрешности:');
if Form1.CheckBox2.State = cbChecked
then Form1.Label5.Caption:='h'+Form1.Edit1.Text+'L'+Form1.Edit2.Text+'.txt';
for K:=1 to N do
begin
M:=Pi/4/L;
if Y(Pi*(K-1)/L+M)<=0
then
repeat M:=M/2;
until Y(Pi*(K-1)/L+M)>0;
X1:=Pi*(K-1)/L+M;
X2:=Pi*(K-1)/L+2*M;
W:=X2;
P:=Round(Ln(M/DX)/Ln(2));
for I:=1 to P do
begin
if Y(X1)*Y(W)<=0
then X2:=W
else X1:=W;
W:=(X1+X2)/2;
end;
Form1.Memo1.Lines.Add('W('+IntToStr(K)+')='+FloatToStr(W));
Form1.Memo2.Lines.Add('d('+IntToStr(K)+')='+FloatToStr(Y(W)));
Form1.Memo3.Lines.Add('f('+IntToStr(K)+')='+FloatToStr(abs(Y(W)/W)));
end;
Form1.Memo1.Visible:=true;
if Form1.CheckBox2.State = cbChecked
then
begin
AssignFile(F,Form1.Label5.Caption);
Rewrite(F);
WriteLn(F,Form1.Memo1.Text);
WriteLn(F,Form1.Memo2.Text);
WriteLn(F,Form1.Memo3.Text);
Close(F);
end;
end;