• Регистрация
ArtemKom
ArtemKom +1.06
н/д

Задание функции

30.10.2019
Доброго времени суток. Столкнулся с такой проблемой - не могу понять как задать функцию. Агумент функции имеет точку, назовем ее x1 (x1 известен), до и после которой функция имеет разные зависимости о...

Доброго времени суток. Столкнулся с такой проблемой - не могу понять как задать функцию. Агумент функции имеет точку, назовем ее x1 (x1 известен), до и после которой функция имеет разные зависимости от аргумента, пусть это будет x^2 и sin(x). Как задать функцию, чтобы потом работать с ней как с единым целым, не деля ее на 2 части? Заранее спасибо!

Теги

    30.10.2019

    Комментарии

    • Centurio
      Centurio+42.00
      2.11.2019 03:57

      y=x.^2.*(x<=x1)+sin(x).*(x>x1);

      • ArtemKom
        ArtemKom+1.06
        2.11.2019 18:54

        Спасибо большое!)

        • Ye_Gayev
          Ye_Gayev+4.24
          1.12.2019 15:54

          ОКей!

          Такие функции называют кусочно-заданными. В этом решении использовано "логическое свойство МАТЛАБ", true+1=1. Такое есть еще в Python. Как по мне, это Великое Качество МАТЛАБ!

          • ArtemKom
            ArtemKom+1.06
            1.12.2019 19:18

            Здравствуйте. А вы не подскажите как задать кусочно-заданную функцию на наскольких интервалах (а не на одном, как в вопросе), т.е. для x1<x2, x3<=x4, например?

            • Ye_Gayev
              Ye_Gayev+4.24
              2.12.2019 17:55

              Есть два метода.

              №1, как в любом другом языке программирования:

              function y=FuncOnSeveralIntervals(x,a)

              %Example of a PiceWise function on several intervals

              %    {-a,      if x<-1

              %y={ax,     if -1<=x<=0

              %    {x^2,   if 0<x<1

              %    {1,       if  x>=1

              %Example of use:

              % >> ezplot('FuncOnSeveralIntervals(x,1)', [-2 2])

              %Copyright Ye.Gayev, Dec. 2019.

              if x<-1

                  y=-a;

              elseif (-1<=x)&&(x<=0)

                  y=a*x;

              elseif (0<x)&&(x<=1)

                  y=x^2;

              else

                  y=1;

               

              end

               

              Ситуация сложнее, если функцию надо ПЕРИОДИЧЕСКИ ПРОДОЛЖИТЬ на всю числовую ось с интервала, скажем, [-2,  2]. А также -- научить понимать, согласно МАТЛАБ-стандарту, векторный аргумент. Сие можно посмотреть в моей книжке Сучасне програмування, Модулі 1,2.  http://er.nau.edu.ua/handle/NAU/28248   (хоть она українською мовою, но понять, особенно математику и коды, легко).

               

               

               

               

              • Ye_Gayev
                Ye_Gayev+4.24
                2.12.2019 18:11

                Метод №2 -- как верно подсказывает Галкин Сергей Галкин Валентинович. Для данного случая:

                function y=FuncOnSeveralIntervalsLogics(x,a)

                %Example of a PiceWise function on several intervals

                %by using MATLAB's Logical Feature.

                %    {-a,      if x<-1

                %y={ax,     if -1<=x<=0

                %    {x^2,   if 0<x<1

                %    {1,       if  x>=1

                %Example of use:

                % ezplot('FuncOnSeveralIntervalsLogics(x,1)', [-3 3])

                %Copyright Ye.Gayev, Dec. 2019.

                y= -a*(x<-1) + a*x*((-1<=x)&&(x<=0)) + x^2*( (0<x)&&(x<=1)) + (x>1);

                Здесь, как и в предыдущем способе, остаются проблемы: 1. Чтобы понимала векторный аргумент, и 2. Чтобы была периодической на   -Inf  <  x  <  Inf.

                Отсылаю туда же:
                Азарсков В.М., Гаєв Є.О.
                Сучасне програмування, Модулі 1,2.  http://er.nau.edu.ua/handle/NAU/28248

                • ArtemKom
                  ArtemKom+1.06
                  2.12.2019 19:07

                  Хорошо, спасибо большое!

        • Ye_Gayev
          Ye_Gayev+4.24
          1.12.2019 21:32

          Отвечу завтра

          • Ye_Gayev
            Ye_Gayev+4.24
            1.12.2019 21:34

            Была опечатка: true+1=2