На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Задачка , нахождение длины кривой
    ExpandedWrap disabled
      {$N+}
      type
        fofx = function(x : real) : real; { needed for function-evaluating }
       
      function derivative(x, dx : real; f : pointer) : real;
      var y : fofx;
      begin
        @y := f;
        derivative := (y(x + dx/2) - y(x - dx/2)) / dx;
      end;
       
      { Integrates function from a to b,
        by approximating function with
        rectangles of width h. }
      function integral(a, b, h : real; f : pointer) : real;
      var
        x, summation : real;
        y        : fofx;
      begin
        @y := f;
        summation := 0;
        x := a + h/2;
        while x < b do
        begin
             summation:= summation + h *
              sqrt( sqr(y(x)) + sqr( derivative(x,h,f) ) ); {Integral Expression}
             x:=x+h;
        end;
        integral := summation;
      end;
       
      function Length(a, b, h : real; f : pointer) : real;
      begin
             Length:=integral(a,b,h,f);
      end;
       
      function F(x : real) : real; FAR;
      begin
           F:=1.0-sin(x);
      end;
       
      begin
           writeln('Curve length:',Length(-pi/2,-pi/6, 1e-4, @F):8:5);
           readln;
      end.
      Ого :blink:. Большое спасибо! Маленькая просьба: объясните алгоритм вычисления.
        И что значит 1e-4 ?
          1e-4 = 0.0001
            function derivative(x, dx : real; f : pointer) : real; - Производная функции

            dx - приращение
            x - dx/2 левая граница прямоугольника
            x + dx/2 правая граница прям-ка


            function integral(a, b, h : real; f : pointer) : real; - собственно, вычисляет интегралб равный приближенно сумме всех прям-ков шириной h.

            h - точность вычисления (ширина). Чем меньше значение, тем больше таких прям-ков и точнее результат.
            x := a + h/2; начальное значение х
            summation:= summation + h * sqrt( sqr(y(x)) + sqr( derivative(x,h,f) ) );
            - подынтегральное выражение (высота прям-ка), т.е. (p^2 + (p')^2)^1/2 - для вычисления длины кривой.

            @F - передаём указатель на функцию кривой
            Сообщение отредактировано: romtek -
              Почему начальное значение x = a + h/2, а не a?
                Т.к. надо вычислить производную, берем некоторый отступ от левой границы. Тогда в точке С из промежутка [Xi-1,Xi] можно взять производную. Прямоугольник будет окрестностью той точки.
                Вроде так.
                  Я пишу x := a; - ответ тот же...??
                    M
                    Тема перенесена из Delphi -> Delphi: Общие вопросы.
                      ExpandedWrap disabled
                        function F(x : real) : real; FAR;
                        begin
                             F:=1.0-sin(x); {здесь ты описываешь свою функцию}
                        end;

                      А границы надо задавать в радианах.
                      function Length(a, b, h : real; f : pointer) : real;
                      a - левая граница отрезка
                      b - правая граница отрезка
                      h - точность вычислений ( 1e-3 = 1*10^(-3) )
                        Насколько я знаю, формула для вычисления длины кривой в полярных координатах такова:
                        user posted image
                        Но даже на листике при таких параметрах считать не быстро.
                        Сообщение отредактировано: startinger -
                          Как начертить этот график в MathCad?? Графика -> полярный график, а дальше как, где и что задавать не пойму (это попросили меня еще в PaintBox'е нарисовать его).
                            На рисунке:
                            внизу, х - переменная
                            слева - формула у(х)
                            остальное не знаю, выставляется автоматически.
                            Прикреплённый файлПрикреплённый файлmcad_polar.gif (3.89 Кбайт, скачиваний: 246)
                              a=f1*pi/180 - левая граница, угол Фи1
                              b=f2*pi/180 - правая граница, угол Фи2

                              h - это и есть твоя точность c=0.0001

                              Это уже геометрия...
                              Polar -> Cartezian
                              x = r * cos (phi);
                              y = r * sin (phi);

                              Cartezian -> Polar
                              phi = arctan (y / x); {x<>0}
                              r = sqrt ( sqr(x) + sqr(y) );

                              Я понимаю формулу чуть по другому...
                              ExpandedWrap disabled
                                function Degree3(x : real) : real;
                                begin
                                  Degree3 := x * x * x;
                                end;
                                 
                                function f(fi : real) : real;
                                begin
                                  f := (3 * a * cos(fi) * sin(fi)) / (Degree3(cos(fi)) + Degree3(sin(fi)))
                                end;

                              Прикреплённый файлПрикреплённый файлcurve_length.gif (5.04 Кбайт, скачиваний: 223)
                                Дана последовательность содержащая от 1 до 30 слов в каждом из которых от 1 до 5 строчных латинских букв между соседними словами – запятая, за последним точка.
                                Напечатать ту же последовательность, но удалив из нее повторные вдождения слов
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0407 ]   [ 15 queries used ]   [ Generated: 19.05.24, 20:05 GMT ]