Обратная функция заданной функции

У меня есть функция с двумя входами x а также y который возвращается z основанный на некоторых условиях (которые основаны на значениях x а также y). Нечто похожее на следующий псевдокод.

f(x, y)
    if x < a && y < b
        return z=x+y;
    else if x >= a && x < c && y >= b && y < d
        return z=x-y;
    else x >= c && y >= d
        return z=x*y;

Теперь я хочу написать функцию, которая почти действует как обратная функция для f (Давайте назовем это g). Псевдокод должен выглядеть примерно так:

g(z)
    return x1, x2, y1 and y2; //x's, y's are corresponding boundaries for given z

Предположим, что f является очень очень простым и основывается только на нескольких условиях, а возвращаемое значение так же просто, как некоторые арифметические утверждения (в точности аналогичные приведенным выше). Как ты пишешь g? Вы просто храните границы и соответствующие возвращаемые значения из f а затем пройти между ними с заданным z найти подходящие границы? Я пытаюсь увидеть, как другие люди взломают это. Обратите внимание, что f также написано вами, и вы знаете все об этом.

ПРИМЕЧАНИЕ. Предположим, что возвращаемые значения всегда различны и не перекрываются ни в каких ситуациях.

2 ответа

Вы бы начали с рассмотрения каждого из условий. Каковы значения х и у, если они должны были соответствовать минимальному условию. Например, если x и y были чуть меньше, чем a и b соответственно, сможет ли уравнение x + y когда-либо удовлетворить z. То есть x + y будет больше, чем z. Если нет, то ни одно из чисел, меньших, чем текущие x и y, не может быть исключено. Затем вы можете перейти к следующему состоянию и так далее. Если значения для x и y могут удовлетворять условию, то вы должны начать с нижних границ и перебрать возможные значения в этом диапазоне или, возможно, использовать алгебру для ее решения.

  1. ваша функция

    double f(double x,double y) // z=f(x,y)
     {
           if ((x<a)&&(y<b))                return x+y;
     else if ((x>=a)&&(x<c)&&(y>=b)&&(y<d)) return x-y;
     else if ((x>=c)&&(y>=d))               return x*y;
                                            return ???;
     }
    

    если вам не хватает воображения, как я, то для лучшего понимания нарисуйте карту

    БПМЖ

    теперь более очевидно, что это отображение один ко многим

    z=x+y -> y=z-x , x=z-y
    z=x-y -> y=x-z , x=z+y
    z=x*y -> y=z/x , x=z/y
    

    также эти 3 определенных интервала x,y может дать то же самое z ценности

  2. обратная функция

    не стоит возвращать интервалы x,y либо вы делаете g() 2D- функция, такая как x=g2d(y,z) или же y=g2d(x,z),

    Или вы возвращаете список всех действительных x,y пары не интервалы!!! Что также можно сделать через 2D g() функция

    пример 2D g функция:

    double g2d(double x,double z) // y=g(x,z)
     {
          if (x<a) return z-x;
     else if (x<c) return x-z;
     else          return z/x;
     }
    

    Вы должны добавить также вычисляется y проверка диапазона для правильного решения перед возвратом, но я слишком ленив для этого.

    пример 1D g функция:

    void g(double *x,double *y,int &n,double z) // x[n],y[n]=g(z)   ... x,y should be allocated big enough or use some list/vector template
     {
     double xx;
     const double min =-1e+3;
     const double max =+1e+3;
     const double step=+1e-3;
     n=0; // reset found solution count
     for (xx=min;xx<=max;xx+=step) // go through valid x axis
      {      
      x[n]=xx;
      y[n]=g2d(xx,z);
      // here add check if solution valid and continue if not
      // also can add check for max n to avoid overrun of arrays x[],y[]
      n++; // add new valid solution to list
      }
     }
    

[заметки]

весь код в C++

Другие вопросы по тегам