21.02.2014, 09:54 | #1 (ссылка) |
Новичок
Регистрация: 19.07.2011
Сообщений: 58
Репутация: 0
|
Delphi 7
Здравствуйте, возникла проблема в процессе обучения в колледже.
Предмет компьютерное моделирование, не могу решить вроде простую задачу: На поверхности воды плавает шар радиуса R. Определить глубину погружения шара h методом последовательных приближений. Плотность материала, из которого сделан шар равна р. Написать программу, производящую вычисление h с точностью до 0.001. При составлении программы использовать формулу объема шарового сегмента высотой h: V=1/3 Pi h2(3r-h) Т.е. программа должна вычислять на сколько шар находиться в воде. Входящие данные: r(радиус) и p(плотность). Исходящие данные: h(глубина погружения). Помогите пожалуйста.) |
26.02.2014, 19:36 | #2 (ссылка) |
Новичок
Регистрация: 21.11.2009
Сообщений: 486
Репутация: 47
|
Asasinx, если еще нужно, то не очень разбираюсь, но можно попробовать так:
Код:
unit SimpleIter; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Math, StdCtrls; type TForm1 = class(TForm) ButtonSolve: TButton; LabelSolve: TLabel; LabelSolved: TLabel; LabelHint: TLabel; LabelSphereR: TLabel; LabelSphereRo: TLabel; procedure ButtonSolveClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Ro, R, Ms, Vs, K, dx, x, x1, eps, y : Extended; ni, n : Word; solve : Boolean; implementation {$R *.dfm} Function Fy(xx : Extended): Extended; begin Fy:=Pi*xx*xx*(xx/3 - R) + Ms; end; procedure TForm1.ButtonSolveClick(Sender: TObject); begin LabelSolve.Visible:=true; //ищем 0-е приближение высоты погруженного сегмента x:=0.01; //попробуем начать с этого значения y:=Fy(x); If y<0 then repeat x:=x+0.04; y:=Fy(x); until y>=0 Else repeat x:=x+0.04; y:=Fy(x); until y<=0; K:=-0.4; n:=1; y:=Fy(x); x1:=x-K*y; dx:=Abs(x1-x); solve:=True; ni:=1; While (Abs(y)>eps) and (ni>0) do //заодно защитимся от зацикливания begin Inc(ni); //число итераций x:=x1; y:=Fy(x); x1:=x-k*y; If dx<Abs(x1-x) then begin solve:=False; Break; end; dx:=Abs(x1-x); end; If ni=0 then LabelSolve.Caption:='Зацикливание процесса!' Else If not solve then LabelSolve.Caption:='Процесс расходится. Измените K!' Else begin x:=x1; y:=Fy(x); LabelSolve.Caption:='Число итераций: '+IntToStr(ni); LabelSolved.Caption:='x = '+FloatToStrF(x,ffFixed,5,8)+'; y = '+FloatToStrF(y,ffFixed,5,8); LabelSolved.Visible:=true; LabelHint.Visible:=true; end; end; procedure TForm1.FormCreate(Sender: TObject); begin eps:=0.0001; R:=0.2; //радиус шара Ro:=0.75; //плотность материала шара Ms:=Ro*4*Pi*R*R*R/3; //масса шара LabelSphereR.Caption:='Радиус шара ' + FloatToStrF(R,ffFixed,2,2); LabelSphereRo.Caption:='Плотность материала шара ' + FloatToStrF(Ro,ffFixed,2,2); end; end. |
Ads | |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Delphi 7 (графики) | s1gma | Программирование | 1 | 04.06.2011 17:10 |
Delphi 7 | s1gma | Программирование | 1 | 29.05.2011 22:41 |
Delphi | Max_NV | Программы | 1 | 02.12.2010 23:07 |
Delphi 7 | Котакот | Программирование | 4 | 05.01.2009 17:48 |
Delphi | 1223 | Программирование | 1 | 09.11.2007 21:46 |