![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
![]() Здравствуйте!
Поделитесь кто-нибудь процедурой для определения "фи" по известным лямбда и m_ef (в файле пояснения). Я ведь точно не первый кто с такого рода проблемой встретился... Или подскажите пожалуйста последовательность действий по определению данных из такого типа таблиц? |
#2
|
||||
|
||||
![]() Мой любимый сопромат
![]() Для начала нужно определиться какая тут интерполяция - линейная или криволинейная. Если линейная, то прямая между 2-мя соседними значениями определяется уравнением y=k*x+b, если криволинейная, то уравнением y=k*x^2+b. Составляешь систему уравнений, находишь коэффициенты k и b и спокойно интерполируешь. Хорошо написанная программа не требует документации ICQ 9-184-668. |
#3
|
||||
|
||||
![]() спасибо за помощь!
Совместно с форумом, поисковыми системами и моим умом реализовал определение фи по табл.72 СНиП "Стальные конструкции". Аналогично можно интерполировать любые похожие по структуре таблицы. Может кому пригодится код: Код:
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. |