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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2017, 11:39   #1
Potter94
 
Регистрация: 03.11.2017
Сообщений: 6
По умолчанию

Здравствуйте! Подскажите пожалуйста как реализовать выражения f(z).Буду очень благодарен за помощь!!!

То есть записать математическую функцию через цикл for
Изображения
Тип файла: jpg Снимок.JPG (13.6 Кб, 84 просмотров)

Последний раз редактировалось Вадим Мошев; 03.11.2017 в 22:16.
Potter94 вне форума Ответить с цитированием
Старый 03.11.2017, 12:15   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Potter94 Посмотреть сообщение
То есть записать математическую функцию через цикл for
ну, тут минимум два вложенных FOR понадобится.

но в чём, собственно сложность? где ваши попытки? и на каком ЯВУ пишете код?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2017, 15:04   #3
Potter94
 
Регистрация: 03.11.2017
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Potter94 Посмотреть сообщение
Здравствуйте! Подскажите пожалуйста как реализовать выражения f(z).Буду очень благодарен за помощь!!!

То есть записать математическую функцию через цикл for
Код:
var
  Form1: TForm1;
  Z_heat:real;
  Y_max:real;
  v_max:real;
  i,k,n,L,r,M,t:integer;
  a,b,c,e:real;
  sum09,sum010:real;
  sum1,sum2:real;
  function Z(Z_heat:real):real;

//Метод половинного деления
procedure TForm1.Button2Click(Sender: TObject);
begin
n:=35; a:=0; b:=20; e:=0.000001;
Z_heat:=(a+b)/2;
if  Z(a)*Z(b)<0 then
    begin
       repeat
       c:=(a+b)/2;
       if Z(a)*Z(c)<=0 then b:=c
       else a:=c;
       until abs(b-a)<e;
       Z_heat:=(a+b)/2;
    end;
end;

//Запись математической функции
function Z(Z_heat:real):real;
begin
try
sum1:=0;sum2:=0;
sum09:=0;sum010:=0;
for i:=0 to n do
    Begin
       for k:=0 to i do
         Begin
           if i<1 then L:=1
           Else begin
              L:=1;
              for r:=1 to k do L:=L*r; //факториал 1
           end;
           sum09:=sum09+Power(Z_heat,k)/L;
           sum1:=(1-exp(-Z_heat)*sum09);   //1 выражение
         End;

     if i<=0 then M:=1  //факториал 2
     Else Begin
        M:=1;
        for t:=1 to i do M:=M*t;
     End;
   sum010:=sum010+Power(Y_max,i)/M;
   sum2:=sum2+sum1*sum010;    //2 выражение
   End;
Z:=-v_max+exp(-Y_max)*sum2;         // 1+2 выражение
except
ShowMessage('Число итераций приводит к делению на ноль');
end;
end;
Программа написана на Delphi. Подскажите пожалуйста, что не правильно в самом выражении? При запуске программы факториалы получаются равными 0. Предполагаю, что число итераций n-слишком большое, а тип real не справляется!

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 10.11.2017 в 15:12.
Potter94 вне форума Ответить с цитированием
Старый 10.11.2017, 15:18   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Potter94 Посмотреть сообщение
Предполагаю, что число итераций n-слишком большое, а тип real не справляется!
скорее всего так и есть.

50! = 30414093201713378043612608166064768 844377641568960512000000000000
~3.041 * 10^65

замените тип данных real на Extended

p.s. ваш код вычислений не смотрел.

p.p.s. глянул на код.
Цитата:
Сообщение от Potter94 Посмотреть сообщение
Код:
L:=1;
              for r:=1 to k do L:=L*r; //факториал 1
так. а причём здесь тип real, если переменная L у Вас типа Integer?!
Вы хотите 65значное число впихнуть в Integer?!!!

Последний раз редактировалось Serge_Bliznykov; 10.11.2017 в 15:20.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2017, 15:28   #5
Potter94
 
Регистрация: 03.11.2017
Сообщений: 6
По умолчанию

Извините, а не могли бы вы пожалуйста проверить правильность записи математического выражения?
Potter94 вне форума Ответить с цитированием
Старый 10.11.2017, 16:14   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

начиная с того, что у Вас переменные v_max и Y_max не присваиваются в коде.

и заканчивая тем, что Вы в цикле по k внутри зачем-то умножаете на
(1-exp(-Z_heat), а это нужно вынести за пределы цикла.

p.s. при вычислении факториала проверять на ноль не нужно. оно и так 1 выйдет.
внутренний цикл я бы записал так:
Код:
  sum09:=0.0;
  for k:=0 to i do
         Begin
             L:=1.0;
             for r:=2 to k do L:=L*r; //факториал 1
             sum09 := sum09 + Power(Z_heat,k)/L;
         End;

Последний раз редактировалось Serge_Bliznykov; 10.11.2017 в 16:18.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.11.2017, 15:49   #7
Potter94
 
Регистрация: 03.11.2017
Сообщений: 6
По умолчанию

Код:
function Z(Z_heat:extended):extended;
begin
sum1:=0;sum2:=0;
sum010:=0;
for i:=0 to n do
    Begin
       sum09:=0;
            for k:=0 to i do
              Begin
                L:=1;
                  for r:=2 to k do L:=L*r; //факториал 1
                  sum09:=sum09+Power(Z_heat,k)/L;
              End;
            sum1:=(1-exp(-Z_heat)*sum09); //1 выражение

        M:=1;
          for t:=2 to i do M:=M*t;
          sum010:=sum010+Power(Y_max,i)/M;
    sum2:=sum2+sum1*sum010;  //2 выражение
    End;
Z:=-v_max+exp(-Y_max)*sum2;         // 1+2 выражение
end;
Извините, обращаюсь еще раз. В записи математического уравнения все равно имеется ошибка. Результат - Z_heat, получается неправильным. Подскажите пожалуйста в чем моя ошибка
Potter94 вне форума Ответить с цитированием
Старый 11.11.2017, 23:12   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Potter94 Посмотреть сообщение
Результат - Z_heat, получается неправильным.
во-первых, Вы что-то путаете.
Вам нужно найти значение функции f(z)
z- это ВХОДНОЙ параметр, или, как говорят, "переменная" функции.
а ваш код должен вычислить результат.
поэтому Z_heat нужно вводить, оно не должно вычисляться.
Как при этом оно может быть неправильным?!

во-вторых,
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Переменные v_max и Y_max не присваиваются в коде.
Вы сделали присвоение этих переменных?

в-третьих, Вы исправили тип переменных?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.11.2017, 19:10   #9
Potter94
 
Регистрация: 03.11.2017
Сообщений: 6
По умолчанию

Код:
var
  Form1: TForm1;
  Z_heat:extended;
  a,b,c,e:extended;
  sum1,sum2,sum09,sum010:extended;
  v_max,Y_max:extended;
  i,k,n,r,t:integer;
  L,M:cardinal;
  function Z(Z_heat:extended):extended;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
a:=StrToFloat(edit5.Text);
b:=StrToFloat(edit6.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);

begin
edit1.Text:=FloatToStr(Z(a));
edit8.Text:=FloatToStr(Z(b));
e:=0.000001;
 if  Z(a)*Z(b)<=0 then
    begin
       while abs(b-a)>e do
        begin
          c:=(a+b)/2;
          if Z(a)*Z(c)>0 then a:=c
          else b:=c;
        end;
        Z_heat:=(a+b)/2;
    end;
edit7.Text:=FloatToStr(Z_heat);
end;

//Подпрограмма
{Относительное время нагрева}
function Z(Z_heat:extended):extended;
begin
sum1:=0;sum2:=0;
sum010:=0;
for i:=0 to n do
    Begin
       sum09:=0;
            for k:=0 to i do
              Begin
                L:=1;
                  for r:=2 to k do L:=L*r; //факториал 1
                  sum09:=sum09+Power(Z_heat,k)/L;
              End;
            sum1:=(1-exp(-Z_heat)*sum09); //1 выражение

        M:=1;
          for t:=2 to i do M:=M*t;
          sum010:=sum010+Power(Y_max,i)/M;
    sum2:=sum2+sum1*sum010;  //2 выражение
    End;
Z:=-v_max+exp(-Y_max)*sum2;         // 1+2 выражение
end;
Программа предназначена для определения величины Z_heat методом половинного деления, т.е. задавая значения v_max и Y_max, n=35, промежуток на котором должно лежать значение Z_heat, по математической зависимости (представлена в самом верху) определяется последовательно значение искомой величины с точностью e=0,00001. Тип переменных и значение v_max и Y_max задаются в Edit. Пробовал вводить простейшую функцию, для нее решение находит правильно. Поэтому что-то не правильно при записи самой математической зависимости!
Potter94 вне форума Ответить с цитированием
Старый 13.11.2017, 02:54   #10
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

1.jpg
ura_111 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запись математического выражения на C++ DesQ Помощь студентам 3 18.09.2014 00:21
Как записать математическую функцию "1/x" из калькулятора(windows) в Borland C++ Builder Женька Good Помощь студентам 3 24.09.2012 19:37
Решение математического выражения DeadWarlock Паскаль, Turbo Pascal, PascalABC.NET 2 18.09.2012 18:23
решение математического выражения akum905 Общие вопросы C/C++ 0 12.11.2011 00:04
Реализация через функцию c++\noob Общие вопросы C/C++ 0 08.03.2011 12:29