Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.04.2011, 20:57
Аватар для _Антон_
_Антон_ _Антон_ вне форума
Прохожий
 
Регистрация: 17.08.2010
Сообщения: 36
Репутация: 10
По умолчанию Прошу помощи с интерполяцией...

Здравствуйте!
Поделитесь кто-нибудь процедурой для определения "фи" по известным лямбда и m_ef (в файле пояснения).
Я ведь точно не первый кто с такого рода проблемой встретился...

Или подскажите пожалуйста последовательность действий по определению данных из такого типа таблиц?
Вложения
Тип файла: 7z тваблица.7z (200.8 Кбайт, 8 просмотров)
Ответить с цитированием
  #2  
Старый 18.04.2011, 10:52
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Мой любимый сопромат

Для начала нужно определиться какая тут интерполяция - линейная или криволинейная.
Если линейная, то прямая между 2-мя соседними значениями определяется уравнением y=k*x+b, если криволинейная, то уравнением y=k*x^2+b.

Составляешь систему уравнений, находишь коэффициенты k и b и спокойно интерполируешь.
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
Ответить с цитированием
  #3  
Старый 19.04.2011, 00:07
Аватар для _Антон_
_Антон_ _Антон_ вне форума
Прохожий
 
Регистрация: 17.08.2010
Сообщения: 36
Репутация: 10
По умолчанию

спасибо за помощь!
Совместно с форумом, поисковыми системами и моим умом реализовал определение фи по табл.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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:18.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025