Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, Math;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Label4: TLabel;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
procedure FormCreate(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var s0,smin,sav,smax,xp,p,r1a,r2a,r3a,ap,smina,smaxa,r1aa,r2aa,r1a3,r2a3,x,r1a13,r1a23,r2a13,r3a13: array [1..4] of real;
I,t: Integer;
var rp1,rp2,rp3,rp1a,rp3a,a,da,summ,rmina,rmaxa,risk,riska,rmin,rmax,r: real;
begin
rp1:=strtofloat(edit3.text);
rp2:=strtofloat(edit4.text);
rp3:=strtofloat(edit5.text);
a:=strtofloat(edit6.text);
da:=strtofloat(edit7.text);
risk:=strtofloat(edit8.text);
for I := 1 to StringGrid1.Rowcount do
with stringgrid1 do
begin
s0(i):=cells(1,i-1);
smin(i):=cells(2,i-1);
sav(i):=cells(3,i-1);
smax(i):=cells(4,i-1);
xp(i):=cells(5,i-1);
p(i):=cells(6,i-1);
end;
t:=StrToInt(edit2.Text);
for I := 1 to 4 do
ap(i):=(xp(i)-smin(i))/(sav(i)-smin(i));
r1a(i):=(smin(i)-s0(i))/(t*s0(i));
r2a(i):=(sav(i)-s0(i))/(t*s0(i));
r3a(i):=(smax(i)-s0(i))/(t*s0(i));
r1a13(i):=(xp(i)-p(i)-s0(i))/(t*s0(i));
r1a23(i):=(xp(i)-s0(i))/(sav(i)-smin(i));
r2a13(i):=(sav(i)-p(i)-s0(i))/(t*(s0(i)+p(i)));
r3a13(i):=(smax(i)-p(i)-s0(i))/(t*(s0(i)+p(i)));
smina(i):=smin(i)+ap(i)*(sav(i)-smin(i));
smaxa(i):=smax(i)+ap(i)*(sav(i)-smax(i));
r1aa(i):=(smina(i)-s0(i))/(t*s0(i));
r2aa(i):=(smaxa(i)-s0(i))/(t*s0(i));
if (a>=0) and (a<=ap[i]) then
r1a3(i):=(xp(i)-p(i)-s0(i))/(t*(p(i)+s0(i)));
if (a>=ap(i)) and (a<=1) then
r1a3(i):=(smina(i)-s0(i))/(t*s0(i));
r2a3(i):=(smaxa(i)-p(i)-s0(i))/(t*(p(i)+s0(i)));
rmina:=r1aa(i)*x(i)+r1a3(i)*x(i);
rmaxa:=r2aa(i)*x(i)+r2a3(i)*x(i);
if rp3a<rmina then
riska:=0;
if (rp1a<=rmina) and (rmina<=rp3a) and (rp3a<=rmaxa) then
riska:=((power(2,(rp3a-rmina)))/(2*(rp3a-rp1a)*(rmaxa-rmina)));
if (rmina<=rp1a) and (rp1a<=rp3a) and (rp3a<=rmaxa) then
riska:=(((rp1a-rmina)+(rp3a-rmina))/(2*(rmaxa-rmina)));
if (rp1a<=rmina) and (rmina<=rmaxa) and (rmaxa<=rp3a) then
riska:=(((rp3a-rmaxa)+(rp3a-rmina))/(2*(rp3a-rp1a)));
if (rmina<=rp1a) and (rp1a<=rmaxa) and (rmaxa<=rp3a) then
riska:=(1-(((power(2,(rmaxa-rp1a))))/(2*(rp3a-rp1a)*(rmaxa-rmina))));
if (rmaxa<=rp1a) then
riska:=1;
end;
procedure TForm1.Edit1Change(Sender: TObject);
var k: integer;
begin
k:=strtoint(edit1.text);
StringGrid1.RowCount:=k+1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Cells[1,0]:='S0';
StringGrid1.Cells[2,0]:='Smin';
StringGrid1.Cells[3,0]:='Sav';
StringGrid1.Cells[4,0]:='Smax';
StringGrid1.Cells[5,0]:='Xp';
StringGrid1.Cells[6,0]:='P';
end;
end.
здесь нужно rmina взять как целевую функцию, изменять массив x при ограничениях riska=risk & summ x<=1