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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2013, 16:45   #1
Osvetik
Новичок
Джуниор
 
Регистрация: 17.02.2013
Сообщений: 3
По умолчанию есть целевая функция (площадь поперечного сечения двутавра) подобрать параметры,чтобы площадь была минимальной (Паскаль)

Здравствуйте! я студент и моя специальность никак не связана с программированием, я не знаю как правильно писать программы и на чем вообще все строится, но для конференции профессор попросил написать небольшую программку. Я взялась за книги, написала, но к сожалению она не работает и я никак не могу понять почему. Пожалуйста, помогите найти ошибку!!!!
Код:
PROGRAM _1;
VAR tf,bf,t1,hw,a,f,Aplmin,Apl,tfmin,bfmin,t1min,hwmin,amin,fmin:REAL;

BEGIN
tf:=0.4;
bf:=1.5;
t1:=0.4;
hw:=4;
a:=5;
f:=0.75;
Aplmin:=2*tf*bf+hw*t1*(sqrt(4*f*f+a*a));
WHILE tf>=0.01 DO
BEGIN WHILE bf>=0.1 DO
BEGIN WHILE t1>=0.03 DO
BEGIN WHILE hw>=0.5 DO
BEGIN WHILE a>=0 DO
BEGIN WHILE f>=0 DO
Apl:=2*tf*bf+hw*t1*(sqrt(4*f*f+a*a))/a;
BEGIN IF Apl<=Amin THEN
                   BEGIN Apl:=Aplmin;
                         tfmin:=tf;
                         bfmin:=bf;
                         t1min:=t1;
                         hwmin:=hw;
                         amin:=a;
                         fmin:=f;
                   END;
      f:=f-1;
      END;
a:=a-1;
f:=0.75;
END;
hw:=hw-1;
a:=5;
END;
t1:=t1-1;
hw:=4;
END;
bf:=bf-1;
t1:=0.4;
END;
tf:=tf-1;
bf:=1.5;
END;
WRITELN('Âûâîä Aplmin=',Aplmin);
WRITELN('Âûâîä tfmin=',tfmin);
WRITELN('Âûâîä bfmin=',bfmin);
WRITELN('Âûâîä t1min=',t1min);
WRITELN('Âûâîä hwmin=',hwmin);
WRITELN('Âûâîä amin=',amin);
WRITELN('Âûâîä fmin=',fmin);
END.

Последний раз редактировалось Stilet; 17.02.2013 в 19:06.
Osvetik вне форума Ответить с цитированием
Старый 17.02.2013, 16:48   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Светик, давайте поступим по-другому. Вы скините задание, и тогда может быть кто-нибудь Вам его решит
Poma][a вне форума Ответить с цитированием
Старый 17.02.2013, 16:51   #3
Osvetik
Новичок
Джуниор
 
Регистрация: 17.02.2013
Сообщений: 3
По умолчанию

есть так называемая целевая функция A=2*tf*bf+hw*t1*(sqrt(4*f*f+a*a))/a. Это площадь поперечного сечения двутавра с гофрированной стенкой. Нужно таким образом подобрать все составляющие этой функции, чтобы площадь была минимальной.
Osvetik вне форума Ответить с цитированием
Старый 17.02.2013, 18:36   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Код:
Program_1;
Var tf,bf,t1,hw,a,f,Aplmin,Apl,tfmin,bf min,t1min,hwmin,amin,fmin:REAL;

Begin
  tf:=0.4;
  bf:=1.5;
  t1:=0.4;
  hw:=4;
  a:=5;
  f:=0.75;
  Aplmin:=2*tf*bf+hw*t1*(sqrt(4*f*f+a *a));
  While tf>=0.01 DO
  Begin
    bf:=1.5;
    While bf>=0.1 DO
    Begin
      t1:=0.4;
      While t1>=0.03 DO
      Begin
        hw:=4;
        While hw>=0.5 DO
        Begin
          a:=5;
          While a>=0 DO
          Begin
            f:=0.75;
            While f>=0 DO
              Apl:=2*tf*bf+hw*t1*(sqrt(4*f*f+a*a) )/a;
              IF Apl<=Amin THEN
              Begin
                Apl:=Aplmin;
                tfmin:=tf;
                bfmin:=bf;
                t1min:=t1;
                hwmin:=hw;
                amin:=a;
                fmin:=f;
              End;
              f:=f-1;
            End;
            a:=a-1;
          End;
          hw:=hw-1;
        End;
        t1:=t1-1;
      End;
      bf:=bf-1;
    End;
    tf:=tf-1;
  End;
  Writeln('Âûâîä Aplmin=',Aplmin);
  Writeln('Âûâîä tfmin=',tfmin);
  Writeln('Âûâîä bfmin=',bfmin);
  Writeln('Âûâîä t1min=',t1min);
  Writeln('Âûâîä hwmin=',hwmin);
  Writeln('Âûâîä amin=',amin);
  Writeln('Âûâîä fmin=',fmin);
End.
Так было-бы лучше.
См. на начальные значения переменных и шаг с которым они меняются.
Так, для переменной f начальное значение 0.75, шаг -1, т.е. на следующем шаге f = -0.25. Условие прекращения цикла f >=0.
Так полагаю, что неправильно расставлены пределы и определены шаги.

PS:
Цитата:
моя специальность никак не связана с программированием
Сегодня можно сказать, что таких специальностей нет.
Мой совет. Забудьте эту мысль. Это самый неправильный посыл, который Вам сильно мешает и будет мешать дальше.

Как-то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 17.02.2013, 22:30   #5
Osvetik
Новичок
Джуниор
 
Регистрация: 17.02.2013
Сообщений: 3
По умолчанию

спасибо за совет! но даже если поменять шаг на меньший, то Паскаль пишет, что программа выполняется, но в итоге результата нет очень долгое время.
Osvetik вне форума Ответить с цитированием
Старый 18.02.2013, 07:54   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Osvetik Посмотреть сообщение
программа выполняется, но в итоге результата нет очень долгое время.
Результата совсем нет или он появляется через некоторое время?

Вообще-то 6 вложенных циклов - это достаточно большая нагрузка на процессор.
Кстати, бывают программы, которые работают месяцами прежде, чем выдать что-то полезное. И это нормально.
Вполне вероятно, что можно оптимизировать Вашу программу, чтобы она считала значительно быстрее, но для написания такой программы, вероятнее всего, потребуется гораздо больше времени программиста. Да и сама программа может получиться намного длиннее.
s-andriano вне форума Ответить с цитированием
Старый 18.02.2013, 20:33   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Было бы куда полезней к выложенному коду добавить и условие задачи: начальные и конечные значения параметров, возможный размер шага.
В моём понимании - в предложенном коде есть ошибка как в условии завершения цикла, так и задании граничных значений параметра.
Приведите значения, например, так:
Код:
Параметр    |  Нач.знач. |  Кон.знач |   Шаг    |
------------+------------+-----------+---------+
     tf           0.4          0.1       -0.05
   ...

Как-то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 19.02.2013, 21:51   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Вот о чем я ещё подумал:
Вычисление целевой функции
Код:
Apl:=2*tf*bf+hw*t1*(sqrt(4*f*f+a*a) )/a;
следует сделать по частям для каждого цикла. Как-то так:
Код:
part1 := 2*tf;
part2 := part1 * bf;
part3 := hw*t1;
part4 := 4*sqr(f);
Apl := part2 + part3 * sqrt(part4 + sqr(a))/a;
Скорость должна возрасти.


Как-то так ...
PS: Приведенные выражения надо вставить в подходящие части циклов.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 19.02.2013, 22:18   #9
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Эм.. Не осилил весь текст, но, по-моему
tf = 0,01;
bf = 0,1;
hw = 0,5;
t1 = 0,03;
f = 0;

При таких параметрах значение функции будет минимальным, нет? Аналитически посчитал, на бумажке, за 2 минуты.
А вот так работать вообще не должно
Код:
While a>=0 DO
там же деление на ноль будет.
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны площадь круга и площадь квадрата Joker<777> Паскаль, Turbo Pascal, PascalABC.NET 10 17.01.2012 07:00
Бейсик. Вычисление момента инерции,момента сопротивления площади поперечного сечения для кольца kostia-92 Помощь студентам 0 26.06.2011 09:58
ООП (паскаль) - дан ромб. найти площадь. построить пирамиду, найти её площадь Rfn.if Помощь студентам 0 27.04.2011 16:10
Площадь круга sturz Помощь студентам 20 23.01.2011 11:07
Вычислить площадь треугольника по трём точкам [Паскаль] Canavar Помощь студентам 8 08.12.2010 17:35