IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> метод ломаных, правильный ли алгоритм
_92
сообщение 1.12.2007 22:20
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской
Реальное имя: alex

Репутация: -  0  +


почему-то выводится max: y=-4, x=1, хотя ведь для y=x^(2/3)*(x-5) max: y=0, x=0



unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Buttons, Math;

type

  { TForm1 }

  TForm1 = class(TForm)
	Button1: TButton;
	Edit2: TEdit;
	Edit3: TEdit;
	Edit4: TEdit;
	Edit5: TEdit;
	Edit6: TEdit;
	GroupBox2: TGroupBox;
	GroupBox3: TGroupBox;
	GroupBox4: TGroupBox;
	procedure Button1Click(Sender: TObject);
  private
	{ private declarations }
  public
	{ public declarations }
  end; 
  
type
  TMyData =
	record
	  U: real;
	  J: real;
	end;

var
  Form1: TForm1; 

var
  a,b,L: real;
  MyData: array of TMyData;

implementation

{ TForm1 }

function MyFunction(x:real): real;
begin
  //power(x,2/3)*(x-5)
  Result:=exp(ln(x*x)/3)*(x-5)
end;

function Peresechenie(i:integer; L:real): real;
begin
  Peresechenie:=(MyData[i].J-MyData[i+1].J+L*(MyData[i].U+MyData[i+1].U))/(2*L)
end;

procedure InsertNew(X: real);
var
  i,j: integer;
begin
  i:=0;

  while MyData[i].U<x do
	inc(i);

  SetLength(MyData,Length(MyData)+1);

  for j:=Length(MyData)-1 downto i+1 do
	begin
	  MyData[j].U:=MyData[j-1].U;
	  MyData[j].J:=MyData[j-1].J;
	end;

  MyData[i].U:=x;
  MyData[i].J:=MyFunction(x)
end;

function MaxIndex: integer;
var
  i,j: integer;
  max: real;
begin
  max:=MyData[0].J;

  for i:=1 to Length(MyData)-1 do
	 begin
	   if MyData[i].J>max then
		 begin
		   max:=MyData[i].J;
		   j:=i
		 end
	 end;

  MaxIndex:=j
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Un,Un2: real;
  i,k,N: integer;
begin
  SetLength(MyData,2);

  a:=StrToFloat(Edit2.Text);
  b:=StrToFloat(Edit3.Text);
  N:=StrToInt(Edit4.Text);

  MyData[0].U:=a;
  MyData[0].J:=MyFunction(MyData[0].U);
  MyData[1].U:=b;
  MyData[1].J:=MyFunction(MyData[1].U);

  L:=abs(MyData[1].J- MyData[0].J)/abs(MyData[1].U-MyData[0].U);

  k:=1;
  i:=0;

  while i<N do
	begin
	  inc(i);
	  if k<Length(MyData) then
		begin
		  Un:=Peresechenie(k-1,L);
		  Un2:=Peresechenie(k,L)
		end;
	  InsertNew(Un);
	  InsertNew(Un2);
	  k:=MaxIndex
	end;

  Edit5.Text:=FloatToStr(MyData[k].U);
  Edit6.Text:=FloatToStr(MyData[k].J)
end;


initialization

{$I unit1.lrs}

end.




--------------------
лишь утратив всё, мы обретаем свободу...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 22.07.2025 22:47
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"