unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
L: array[1..22] of real;
f: array[0..22,1..5] of real;
x, //вводимая гибкость
y, //вычисляемый коэффициент фи
k, //нужен для расчёта (смысл - тангенс угла наклона прямой)
m, //нужен для расчёта (смысл - отсекаемый отрезок по оси ординат)
y1,y2:real;
i, //счетчик в цикле
kr, //
st,
Ry: integer; //расчетное сопротивление стали по пределу текучести
flag:boolean;
begin
L[1]:=10; L[2]:=20; L[3]:=30; L[4]:=40; L[5]:=50;
L[6]:=60; L[7]:=70; L[8]:=80; L[9]:=90; L[10]:=100;
f[0,1]:=200; f[0,2]:=240; f[0,3]:=280; f[0,4]:=320; f[0,5]:=360;
f[1,1]:=988; f[1,2]:=987; f[1,3]:=985; f[1,4]:=984; f[1,5]:=983;
f[2,1]:=967; f[2,2]:=962; f[2,3]:=959; f[2,4]:=955; f[2,5]:=952;
f[3,1]:=939; f[3,2]:=931; f[3,3]:=924; f[3,4]:=917; f[3,5]:=911;
f[4,1]:=906; f[4,2]:=894; f[4,3]:=883; f[4,4]:=873; f[4,5]:=863;
f[5,1]:=869; f[5,2]:=852; f[5,3]:=836; f[5,4]:=822; f[5,5]:=809;
f[6,1]:=827; f[6,2]:=805; f[6,3]:=785; f[6,4]:=766; f[6,5]:=749;
f[7,1]:=782; f[7,2]:=754; f[7,3]:=724; f[7,4]:=687; f[7,5]:=654;
f[8,1]:=734; f[8,2]:=686; f[8,3]:=641; f[8,4]:=602; f[8,5]:=566;
f[9,1]:=665; f[9,2]:=612; f[9,3]:=565; f[9,4]:=522; f[9,5]:=483;
f[10,1]:=599; f[10,2]:=542; f[10,3]:=493; f[10,4]:=448; f[10,5]:=408;
flag:=false;
//определяю по какому столбцу интерполировать:
Ry:=StrToInt(Edit2.text);
st:=0;
case Ry of //проверяем на полное совпадние, тогда интерполяция выполняется 1 раз
200: st:=1;
240: st:=2;
280: st:=3;
320: st:=4;
360: st:=5;
end;
if st<>0 then
flag:=true; //это значит, что интерполируем 1 раз
if st=0 then //если st=0 значит совпадения нет и нужно интерполировать 2 раза
for i:=1 to 5 do
if Ry < f[0,i] then
begin
st:=i-1;
break;
end;
showmessage ('Следует вызвать интерполяцию по столбцам '+IntToStr(st)+' и '+IntToStr(st+1));
x:=StrToFloat(Edit1.Text);
kr:=0;
for i:=1 to 10 do
if x<L[i] then
begin
kr:=i;
break;
end;
if kr=0 then
kr:=10;
k:=(f[kr-1,st]-f[kr,st])/(L[kr-1]-L[kr]);
m:=f[kr,st]-k*L[kr];
y1:=k*x+m;
showmessage (FloatToStr(y1));
if flag then
begin
showmessage ('Интерполируем 1 раз.');
showmessage (FloatToStr(y1));
exit;
end;
k:=(f[kr-1,st+1]-f[kr,st+1])/(L[kr-1]-L[kr]);
m:=f[kr,st+1]-k*L[kr];
y2:=k*x+m;
showmessage (FloatToStr(y2));
k:=(y1-y2)/(f[0,st]-f[0,st+1]);
m:=y1-k*f[0,st];
y:=k*Ry+m;
showmessage (FloatToStr(y));
end;
end.