| 
| 
 | Вопрос # 6 093/ вопрос открыт / | 
 |  Доброго времени, уважаемый!Лабораторная работа 10
 Определить массу тела в форме куба со стороной L, плотность которого равномерно убывает от центра к краям. В центре куба плотность равна Pc, а на вершинах куба - Pk.
 T_____T
 
|  |   Вопрос задал: Александр Думов (статус: Посетитель)Вопрос отправлен: 22 апреля 2012, 16:13
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Толяныч Здравствуйте, Александр Думов!Странно, никто не отвечает...
 Я тоже не люблю решать задачи вместо студентов, но эта показалось мне интересной - давно ничего не интегрировал численными методами. Вот что получилось :
 
 Результат работы для А=4, Pmin=1,Pmax=2, Eps= 0.0001
 
 1.5510 0.3553
 1.5537 0.0017
 1.5544 0.0004
 1.5545 0.0001
 1.5546 0.0000
 Result = 99.4934
 
 Смысл в том, что кубик разбиваем на маленькие кубики, плотность в которых считаем постояннрй и равной плотности в центре кубика. Увеличивая число слоев, уменьшаем тем самым размеры кубика, в пределе получится интеграл по объему. Таким образом получаем средневзвешенную плотность. Умножи ее на объем куба , получаем его массу.
 Приложение:Переключить в обычный режим unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ComCtrls, ExtCtrls, Math; type  TForm1 = class(TForm)    Memo1: TMemo;    EdA: TLabeledEdit;    EdMin: TLabeledEdit;    EdMax: TLabeledEdit;    EdEps: TLabeledEdit;    procedure FormClick(Sender: TObject);   private    { Private declarations }  public   end;var  Form1: TForm1  ;  A,Pmin,Pmax,Eps : double ;  Grad,x,y,z,dx,dist,V0,V1,Delt,Px : double ;  NN : integer ;implementation {$R *.dfm}procedure TForm1.FormClick(Sender: TObject);function FunV ( N : integer) : double ;var  ix,iy,iz : integer ;  tmp : double ;begin//  DateSeparator := '.' ;  tmp := 0 ; dx := A / ( N * 4 ) ;  for ix := 0 to N-1 do    begin      x := dx * ( ix * 2 + 1) ;      for iy := 0 to N-1 do        begin          y := dx * ( iy * 2 + 1) ;          for iz := 0 to N-1 do            begin              z := dx * ( iz * 2 + 1) ;              dist := Sqrt ( x*x + y*y + z*z ) ;              tmp := tmp + (dist * Grad) + Pmin ;            end ;         end ;    end ;  Result := tmp * dx * dx * dx;end; //-----------------begin  A := StrToFloat (EdA.Text) ;  Pmin := StrToFloat (EdMin.Text) ;  Pmax := StrToFloat (EdMax.Text) ;  Eps := StrToFloat (EdEps.Text) ;  V0 := 1.0 ;  Grad := (Pmax-Pmin)/(A/2*Sqrt(3)) ;  NN := 4 ;  repeat    V1 := FunV(NN) ;    Delt := (V1-V0)/V1 ; V0 := V1 ;    Memo1.Lines.Add( Format('%6.4f %6.4f',[V1,Delt])) ;    NN := NN + NN ;  until Delt<Eps ;  V1 := V1 * A * A * A ;  Memo1.Lines.Add( Format('Result = %6.4f',[V1])) ;end; end. 
|  | Ответ отправил: Толяныч (статус: 4-ый класс)Время отправки: 24 апреля 2012, 16:37
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо :) Данная задача была задана, по сведениям заказчика, будущим педагогам-математикам. С математикой наверное у них все в порядке, но вот с физикой и с програмированием видимо очень плохо :(:)
 |  
 Мини-форум вопросаВсего сообщений: 2; последнее сообщение — 25 апреля 2012, 12:18; участников в обсуждении: 1. 
|   | Толяныч (статус: 4-ый класс), 25 апреля 2012, 00:48 [#1]:Eps тут - максимально допустимая относительная ошибка. Чем она меньше, тем больше итераций придется выполнить. |  
|   | Толяныч (статус: 4-ый класс), 25 апреля 2012, 12:18 [#2]:Автор обозначился - и исчез. Наверно, в ряды. Тейлора.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |