📄 unit1.~pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Panel2: TPanel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
StringGrid1: TStringGrid;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Panel3: TPanel;
Label4: TLabel;
Label5: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Label6: TLabel;
Edit4: TEdit;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type array2=array[1..99,1..99] of real; //声明的数组类型数据:二维数组
var
Form1: TForm1;
i,j,k,n,s,t:integer;
b,c:real;
a,x,y:array2;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
n:=strtoint(edit1.Text); //n为变量的个数.它比对策矩阵的行数(或列数)多1
stringgrid1.RowCount:=n;
stringgrid1.ColCount:=n;
for i:=1 to n do
begin
stringgrid1.Cells[0,i]:='α'+inttostr(i);
stringgrid1.Cells[i,0]:='β'+inttostr(i);
end;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
for i:=1 to n-1 do
begin
for j:=1 to n-1 do
a[j,i]:=strtofloat(stringgrid1.cells[j,i]);
//将stringgrid1中所输入的矩阵数据即支付矩阵数据映射到二维熟组中
end;
for i:=1 to n-1 do
begin
for j:=1 to n-1 do
begin
y[j,i]:=a[j,i];
x[j,i]:=a[i,j];
end;
end;
for k:=1 to n-1 do
begin
y[n+1,k]:=0;
x[n+1,k]:=0;
end;
for k:=1 to n do
begin
y[n,k]:=-1;
x[n,k]:=-1;
end;
for k:=1 to n+1 do
begin
y[k,n]:=1;
x[k,n]:=1;
end;
y[n,n]:=0;
x[n,n]:=0;
//通过调整,得到由以y和x为变量方程组的系数增广矩阵元素所确定的数组x[]和y[]
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
for s:=1 to n do
begin
for t:=s to n do
begin
if x[s,t]<>0 then
begin
for j:=1 to n+1 do
begin
b:=x[j,s];
x[j,s]:=x[j,t];
x[j,t]:=b;
end;
//如果矩阵元素不等于0,那么首先交换第s行和第t行
c:=1/x[s,s];
for j:=1 to n+1 do
begin
x[j,s]:=x[j,s]*c;
end;
//将第s行的元素进行化简处理.将x[s,s]化为1,其前的元素已化为0
for k:=1 to n do
begin
if k<>s then
begin
c:=-x[s,k];
for j:=1 to n+1 do
begin
x[j,k]:=x[j,k]+x[j,s]*c;
end;
end;
end;
//用第s行的元素将其他行的元素进行高斯消元.
end;
end;
end;
edit2.Text:=' ';
for i:=1 to n-1 do
begin
edit2.Text:=edit2.Text+' '+formatfloat('0.##',(x[n+1,i]));
end;
//输出局中人一的对策概率向量
//局中人一的对策向量求解至此结束,下面是对局中人二进行的向量求解
for s:=1 to n do
begin
for t:=s to n do
begin
if y[s,t]<>0 then
begin
for j:=1 to n+1 do
begin
b:=y[j,s];
y[j,s]:=y[j,t];
y[j,t]:=b;
end;
c:=1/y[s,s];
for j:=1 to n+1 do
begin
y[j,s]:=y[j,s]*c;
end;
for k:=1 to n do
begin
if k<>s then
begin
c:=-y[s,k];
for j:=1 to n+1 do
begin
y[j,k]:=y[j,k]+y[j,s]*c;
end;
end;
end;
end;
end;
end;
edit3.Text:=' ';
for i:=1 to n-1 do
begin
edit3.Text:=edit3.Text+' '+formatfloat('0.##',(y[n+1,i]));
end;
//输出局中人二的对策概率向量
//局中人二的对策向量求解也已结束
edit4.text:=' '+formatfloat('0.##',(x[n+1,n]));
//输出对策值
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -