|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Неверный результат
Помогите люди добрые! Не могу найти ошибку в программе. Перепробовал уже все что мог - все равно не могу найти.
Суть такова. Рассматривается участок трубопровода. Слева стоит насос, справа закрывается задвижка. Программа строит графики давления красным и скоростей зеленым, решая методом характеристик систему диф.уров в частных производных. Но все формулы перепроверены по многу многу раз. Возможно я как то неправильно воспользовался функциями и где то тут у нас с делфи возникли непонимания. Собственно, "неправильность" проявляется во впадине на графике давления, когда волна отражается. Очень надеюсь на помощь! Сроки поджимают, от результата зависит очень многое. Заранее спасибо! Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type mat2=array[0..100,0..10000] of Real; TForm1 = class(TForm) lbl1: TLabel; lbledt1: TLabeledEdit; lbledt2: TLabeledEdit; lbledt3: TLabeledEdit; lbledt4: TLabeledEdit; lbledt5: TLabeledEdit; lbl2: TLabel; lbl3: TLabel; lbledt6: TLabeledEdit; lbledt7: TLabeledEdit; lbledt8: TLabeledEdit; lbledt9: TLabeledEdit; lbl4: TLabel; lbledt10: TLabeledEdit; btn1: TButton; lbledt11: TLabeledEdit; tmr1: TTimer; procedure btn1Click(Sender: TObject); procedure tmr1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; p,v:mat2; pg,xg,pa, t, dzi, dp, i, pp, v1, a, b, nu, ro, c, l, d, del, tz, vsr, re : Real; sec, j, k : Integer; const g=9.81; implementation uses Unit2; {$R *.dfm} procedure dzit; begin if (1-t/tz)<0.05 then begin dzi:=1000000; end else begin if (1-t/tz)<0.95 then begin dzi:=Exp(2.3*(7.661175-72.63827*(1-t/tz)+345.7625*exp(2*ln(1-t/tz))-897.8331*exp(3*ln(1-t/tz))+1275.939*exp(4*ln(1-t/tz))-938.8331*exp(5*ln(1-t/tz))+278.8193*exp(6*ln(1-t/tz)))) end else begin dzi:=0.6-0.6*(1-t/tz) end end; end; function lam(x,m:Integer):Real; begin Re := Abs(v[x,m])*d/nu; if re = 0 then begin Result:=0; end else if Re <= 2320 then begin result := 64 / Re; end else begin result := 0.11*exp(0.25*ln(del/d+68/Re)) end; end; function lam1(v:Real):Real; begin Re := Abs(v)*d/nu; if re = 0 then begin Result:=0; end else if Re <= 2320 then begin result := 64 / Re; end else begin result := 0.11*exp(0.25*ln(del/d+68/Re)) end; end; function Imin:Real; begin result:=p[j-1,k-1]+ro*c*v[j-1,k-1]-0.01*l*lam(j-1,k-1)*ro*v[j-1,k-1]*abs(v[j-1,k-1])/2/d; end; function Iplus:Real; begin result:=p[j+1,k-1]-ro*c*v[j+1,k-1]+0.01*l*lam(j+1,k-1)*ro*v[j+1,k-1]*abs(v[j+1,k-1])/2/d; end; procedure TForm1.btn1Click(Sender: TObject); begin pp :=StrToFloat(lbledt1.text)*1000000; a :=StrToFloat(lbledt2.text); b :=StrToFloat(lbledt3.text)*3600*3600; nu :=StrToFloat(lbledt4.text)/1000000; ro :=StrToFloat(lbledt5.text); c :=StrToFloat(lbledt9.text); l :=StrToFloat(lbledt6.text); d :=StrToFloat(lbledt7.text)/1000; del:=StrToFloat(lbledt8.text)/1000; tz :=StrToFloat(lbledt10.text); pa :=strtofloat(lbledt11.text)*1000000; vsr:=50; v1:=Sqrt( (a+(pp-pa)/ro/g) / (0.0827*pi*pi*lam1(vsr)*l/d/16+b*pi*pi*d*d*d*d/16)); for k:=1 to 100 do begin vsr:=v1; v1:=Sqrt( (a+(pp-pa)/ro/g) / (0.0827*pi*pi*lam1(vsr)*l/d/16+b*pi*pi*d*d*d*d/16)); end; i:=lam1(v1)*v1*v1/2/g/d; dp:=i*ro*g*l; for j:= 0 to 100 do begin v[j,0]:=v1; p[j,0]:=dp+pa-j*i*ro*g*l/100; end; for k:= 1 to 10000 do begin t:=k*0.01*l/c; dzit; j:=0; if Iplus < (pp+ro*g*a) then begin v[j,k]:= Sqrt( (64*c*c)/(g*g*b*b*pi*pi*pi*pi*d*d*d*d*d*d*d*d) - 16*(Iplus-pp-ro*g*a)/(ro*g*b*pi*pi*d*d*d*d)) - (8*c)/(g*b*pi*pi*d*d*d*d); end else begin v[j,k]:=0; end; p[j,k]:=Iplus + ro*c*v[j,k]; for j:= 1 to 99 do begin p[j,k]:=(Imin+Iplus)/2; v[j,k]:=(Imin-Iplus)/2/ro/c; end; j:=100; if Imin > pa then begin v[j,k]:= Sqrt( c*c/dzi/dzi + 2*(Imin-pa)/(ro*dzi) ) - c/dzi; end else begin v[j,k]:=0; end; p[j,k]:= Imin - ro*c*v[j,k]; end; sec:=0; Tmr1.Enabled := true; form2.visible:= true; end; procedure TForm1.tmr1Timer(Sender: TObject); begin Form2.lnsrsSeries1.Clear; Form2.lnsrsSeries2.Clear; for j:=0 to 100 do begin {pg:=p[j,sec-1]/50000; xg:=j*7; form2.Canvas.Pen.Color:=clBtnFace; Form2.Canvas.LineTo(50+round(xg),300-round(pg)); end; form2.Canvas.MoveTo(50,300); for j:=0 to 100 do begin pg:=p[j,sec]/50000; xg:=j*7; form2.Canvas.Pen.Color:=clRed; form2.Canvas.LineTo(50+round(xg),300-round(pg)); end; form2.lbl1.caption:=FloatToStr((sec-1)*0.01);} form2.lnsrsSeries1.AddXY(j*l*0.01,p[j,sec],'',clred); Form2.lnsrsSeries2.AddXY(j*l*0.01,v[j,sec]*1000000,'',clGreen); end; sec:=sec+1; end; end. Последний раз редактировалось KsenIzNN, 10.03.2012 в 17:16. |
#2
|
|||
|
|||
добавил файл программы
|
#3
|
|||
|
|||
непонятки
>добавил файл программы
А где Unit1.pas Unit1.dfm Unit2.pas Unit2.dfm ? |