Вернуться   Компьютерный форум > Компьютеры > Программы > Программирование
 
 
Опции темы
Старый 21.02.2014, 09:54   #1 (ссылка)
Новичок
 
Аватар для Asasinx
 
Регистрация: 19.07.2011
Сообщений: 58
Репутация: 0
По умолчанию Delphi 7

Здравствуйте, возникла проблема в процессе обучения в колледже.
Предмет компьютерное моделирование, не могу решить вроде простую задачу:
На поверхности воды плавает шар радиуса R. Определить глубину погружения шара h методом последовательных приближений. Плотность материала, из которого сделан шар равна р. Написать программу, производящую вычисление h с точностью до 0.001. При составлении программы использовать формулу объема шарового сегмента высотой h:
V=1/3 Pi h2(3r-h)
Т.е. программа должна вычислять на сколько шар находиться в воде.
Входящие данные: r(радиус) и p(плотность).
Исходящие данные: h(глубина погружения).
Помогите пожалуйста.)
Asasinx вне форума  
Старый 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.
sheff-09 вне форума  
Ads
 


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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


Текущее время: 18:02. Часовой пояс GMT +4. Powered by vBulletin® Version 5.8.9
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.