Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2010, 03:11   #1
StudeHt
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 78
По умолчанию Поиск высоты и радиуса цилиндрического бака [Delphi]

Здравствуйте уважаемые эксперты! Вообщем нужно найти размеры бака, чтобы на него ушло наименьшее количество материала. Нужно решить задачу методом Ньютона. Вот получившийся код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, FuncAndDerrivation;

type
  TMainForm = class(TForm)
    Edit_V: TEdit;
    Label_V: TLabel;
    Label_R0: TLabel;
    Label_H0: TLabel;
    Edit_R0: TEdit;
    Edit_H0: TEdit;
    Edit_Eps: TEdit;
    Label_Eps: TLabel;
    ButtonCalcResult: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure ButtonCalcResultClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Edit_V.Clear;
  Edit_R0.Clear;
  Edit_H0.Clear;
  Edit_Eps.Clear;
end;

function Determinant(R0,H0:extended):extended;
begin
  Result:=d_2F_dR_2(R0,H0)*d_2F_dh_2-d_2F_dR_2(R0,H0)*d_2F_dR_2(R0,H0);
end;


procedure TMainForm.ButtonCalcResultClick(Sender: TObject);
var V,R0,H0,Eps,Func,FuncR,FuncH,dx,dy:extended;
    CountIter:integer;
begin
  CountIter:=0;
  V:=StrToFloat(Edit_V.Text);
  R0:=StrToFloat(Edit_R0.Text);
  H0:=StrToFloat(Edit_H0.Text);
  Eps:=StrToFloat(Edit_Eps.Text);
  Func:=F(R0,H0,V);
  repeat
    inc(CountIter);
    FuncR:=dF_dR(R0,H0);
    FuncH:=dF_dH(R0);
    dx:=(d_2F_dh_2*FuncR-d_2F_dR_dh(R0)*FuncH)/Determinant(R0,H0);
    dy:=(d_2F_dR_2(R0,H0)*FuncH-d_2F_dR_dh(R0)*FuncR)/Determinant(R0,H0);
    R0:=R0-dx; H0:=H0-dy; Func:=F(R0,H0,V);
    Memo1.Lines.Add(FloatToStrF(R0,fffixed,2,2)+' '+FloatToStrF(H0,fffixed,8,2));
  until sqrt(sqr(dx)+sqr(dy))<Eps;
end;

end.
И вот модуль к нему:
Код:
unit FuncAndDerrivation;

interface

function F(R,h,V:extended):extended;
function dF_dR(R,h:extended):extended;
function dF_dh(R:extended):extended;
function d_2F_dR_2(R,h:extended):extended;
function d_2F_dh_2:extended;
function d_2F_dR_dh(R:extended):extended;

implementation

function F;
begin
  Result:=Pi*sqr(R)*h-V;
end;

function dF_dR;
begin
  Result:=2*Pi*R*h;
end;

function dF_dh;
begin
  Result:=Pi*sqr(R);
end;

function d_2F_dR_2;
begin
  Result:=2*Pi*R*h;
end;

function d_2F_dh_2;
begin
  Result:=0;
end;

function d_2F_dR_dh;
begin
  Result:=2*Pi*R;
end;

end.
Программа почему-то зацикливается в бесконечном цикле.. Помогите найти ошибку. буду очень благодарен!!!

Последний раз редактировалось StudeHt; 05.01.2010 в 16:00.
StudeHt вне форума Ответить с цитированием
Старый 05.01.2010, 16:01   #2
StudeHt
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 78
По умолчанию

Неужели никто не подскажет??? (в случае помощи в долгу не останусь)

Нашел ошибку в вычисления определителя матрицы Гессе, там такая функция должна быть:
Код:
function Determinant(R0,H0:extended):extended;
begin
  Result:=d_2F_dR_2(R0,H0)*d_2F_dh_2-d_2F_dR_dh(R0)*d_2F_dR_dh(R0);
end;
Теперь в ответе всегда 0 выдается..

Последний раз редактировалось StudeHt; 05.01.2010 в 16:22.
StudeHt вне форума Ответить с цитированием
Старый 05.01.2010, 17:30   #3
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Чтобы помочь, надо знать, какие формулы использовать (ты хоть бы комментировал, что делает та или иная функция), а дальше легко - закодировать эти формулы
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 05.01.2010, 17:45   #4
StudeHt
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 78
По умолчанию

Вот, там нашел еще ошибки, и прокоментровал код.
Вложения
Тип файла: rar 1.rar (171.0 Кб, 12 просмотров)
StudeHt вне форума Ответить с цитированием
Старый 05.01.2010, 19:24   #5
StudeHt
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 78
По умолчанию

Уважаемые модераторы, перенесите тему в раздел "Фриланс".
StudeHt вне форума Ответить с цитированием
Старый 05.01.2010, 19:37   #6
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

функция Result:=Pi*sqr(R)*h-V; что считает? не объём, понятно, тогда что?
непонятно, почему из метрических величин (R, h) вычитают кубические, а что в результате мы получим?
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 05.01.2010, 22:06   #7
StudeHt
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 78
По умолчанию

Функия выведена из функции объема, v=Pi*R^2*h, т.к. метод требует равенства нулю, то объем переносится в правую часть. Я и так сижу с температурой за программой, так что голова не совсем хорошо работает, поэтому я и попросил перенести тему во Фриланс, т.к. сам написать ее уже не успею, да и не то состояние, и готов за это заплатить..
StudeHt вне форума Ответить с цитированием
Старый 06.01.2010, 02:12   #8
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

твоя ошибка:
функция F в расчете данных не принимает участия; ты присваиваешь её значение переменной Func и всё (а значение объёма использ только в этой функции).
Я бы тебе помог, но не знаю этого метода Ньютоновского, по каким формулам считать, что вообще использовать, может метод Гаусса

если б предоставил так (чисто пример):

a = (b * c - r) / 2 * h;
b = c^2 + h;
h = r / 2;
c = h;
r = 6;

понятно, что откуда вытекает, проблем бы никаких не возникло
(а судя по твоему коду, ты знаешь, как представить это)
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 06.01.2010, 02:51   #9
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

//вторая частная производная по h
function d_2F_dh_2;
begin
Result:=0;
end;

почему она равна нулю? В чем смысл функции? Тогда не проще использ константу?
определитель матрицы у тебя ВСЕГДА будет равен отрицательному значению (так надо?)
число итераций CountIter ничего не делает, просто каждый раз прибавляется на 1

а главная ошибка, думаю, в том, что переменная Func в расчетах не участвует, где-то ты потерял её исползование, из-за этого ничего и не получается, посмотри внимательнее, и не придется башлять никому
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоподбор высоты tae1980 Microsoft Office Excel 7 16.11.2010 18:01
Координаты высоты в треугольнике UnChanter Помощь студентам 1 19.10.2009 07:48
паскаль - центр описанной окружност min радиуса Pensioner Помощь студентам 3 19.03.2009 08:51
Опредилите попадает ли точка с координатами(х,у) в круг радиуса R Dog Помощь студентам 2 19.05.2008 19:14