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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.03.2012, 15:17
BinguelBinguel BinguelBinguel вне форума
Прохожий
 
Регистрация: 28.10.2011
Сообщения: 10
Репутация: 10
По умолчанию Линейная Интерполяция

Добого времени суток, очередная проблема, опять с делфи, и опять как обычно накосячила с кодом. В общем, идея задания такова, что дана таблица значения Х и У, и даны два значения Х0, к которым нужно найти У0 соответственно. Составила блок схему - идея ясна, начала писать код, с горем пополам что-то написала, но он не считает! Помогите разобраться.

Код:
unit Unit_int;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    GroupBox1: TGroupBox;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    Edit1: TEdit;
    Edit2: TEdit;
    GroupBox2: TGroupBox;
    Edit3: TEdit;
    Label1: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
matr1 = array[0..9] of double;
Matr2 = array [0..9] of double;
 const
 X:matr1 =(-1.35,-1.05,-0.75,-0.45,-0.15,0.15,0.45,0.75,1.05,1.35);
 Y:matr2 =(-0.41,-0.25,-0.47,-0.41,-0.15,0.15,0.49,1.03,1.85,2.29);

var
  Form1: TForm1;


implementation
function Find (X:matr1; x0:real):integer;
var
 i:integer;
  begin
    i:=0;
     while X[i]< x0 do
       i:=i+1;
       find:=i;
   end;

Function Lint(x0: real):real;
 var
   X:matr1;
   Y:matr2;
   k,c,Ya,Yb,Xa,Xb: real;
   A,B:integer;
     begin

     B:=find(X,x0);
      A:=B-1;

      Xa:=X[A];
      Xb:=X[b];
      Ya:= Y[A];
      Yb:= Y[b];

       k:= (Yb-Ya)/(Xb-Xa);
       c:= Ya-k*Xa;
       Lint:= k*x0+c;
     end;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 i:integer;
begin
decimalseparator:='.';
 for i:=0 to 9 do
  begin
    StringGrid1.Cells[i+1,0]:=floattostr(X[i]);
    StringGrid1.Cells[i+1,1]:=floattostr(Y[i]);
  end;

   StringGrid1.Cells[0,0]:='    x';
   StringGrid1.Cells[0,1]:='    y';
end;



procedure TForm1.Button1Click(Sender: TObject);
var
 x0,y0, Xa,Xb,Ya,Yb: real;
 A,B: integer;
begin
   if RadioButton1.Checked then
      x0 := strtofloat(edit1.text);
    if RadioButton2.Checked then
      x0:= strtofloat(edit2.text);

     // B:=find(X,x0);
      //A:=B-1;

     { Xa:=X[A];
      Xb:=X[b];
      Ya:= Y[A];
      Yb:= Y[b]; }

     y0:=Lint(x0);
       //y0:=floattostrf(edit3.text);
       edit3.Text:=floattostrF(y0,fffixed,6,4);
end;

end.
Вложения
Тип файла: zip Interpolacija.zip (239.7 Кбайт, 7 просмотров)
Ответить с цитированием
  #2  
Старый 08.03.2012, 16:59
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

собственно, тут задача состоит из 2х частей.
1. Если переданный X0 выходит за пределы значений Хов
2. Если он внутри значений.
В обоих случаях расчет будет одинаковый, а вот нахождение точек для него - разное. Сам расчет - надо расчитать коэф. по 2м точкам и просто тупо по формуле Y0 = k*X0 посчитать. K = (y2-y1)/(x2-x1).

В общем, как-то так:
Код:
function GetK(X0 : Double) : Double;
begin
  If X0 < X[0] Then Result := (Y[1]-Y[0])/(X[1]-X[0]) Else
    If X0 > X[9] Then Result := (Y[9]-Y[8])/(X[9]-X[8]) Else
      For I := 0 To 8 Do
        If X0 > X[i] Then
          Begin
            Result := (Y[I+1]-Y[i]) / (X[I+1]-X[i]);
            Break;
          End;
end;

function GetY0(X0 : Double) : Double;
var
  K : Double;
begin
  K := GetK(X0);
  Result := X0 * K;
end;
Ответить с цитированием
  #3  
Старый 08.03.2012, 17:07
BinguelBinguel BinguelBinguel вне форума
Прохожий
 
Регистрация: 28.10.2011
Сообщения: 10
Репутация: 10
По умолчанию

Получается, вся ошибка в том, что у меня не правильно прописано нахождение К?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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