Знайдіть місцеві максими та мінімуми


14

Визначення

Максимуми і мінімуми даної функції - це найбільші і найменші значення функції або в межах заданого діапазону, або іншим чином у межах всієї області функції.

Виклик

Завдання полягає в тому, щоб знайти локальні максимуми і мінімуми заданої функції полінома, використовуючи будь-який метод, який вам може сподобатися . Не хвилюйтесь, я постараюсь пояснити виклик і тримати його максимально просто.

Вхід буде містити всі коефіцієнти одночленної змінної многочлена в порядку зменшення або збільшенні потужності (залежить від вас). Наприклад,

  • [3,-7,1] представлятиме 3x2 - 7x + 1 = 0
  • [4,0,0,-3] представлятиме 4x3-3=0.

Як вирішити (за допомогою похідних)?

Скажімо, наш внесок - [1,-12,45,8]це не що інше, як функція .x3 - 12x2 + 45x + 8

  1. Перше завдання - знайти похідну від цієї функції. Оскільки це поліноміальна функція, то це справді є простим завданням.

    Похідна IS . Будь-які постійні терміни, присутні з , просто множать. Крім того, якщо є додані / віднімані доданки, то їх похідні також додаються або віднімаються відповідно. Пам'ятайте, похідна будь-якого постійного числового значення дорівнює нулю. Ось кілька прикладів:xnn*xn-1xn

    • x3 -> 3x2
    • 9x4 -> 9*4*x3 = 36x3
    • -5x2 -> -5*2*x = - 10x
    • 2x3 - 3x2 + 7x -> 6x2 - 6x + 7
    • 4x2 - 3 -> 8x - 0 = 8x
  2. Тепер розв’яжіть рівняння, прирівнявши новий многочлен до нуля і отримайте лише інтегральні значення х.

  3. Поставте ці значення x у вихідну функцію та поверніть результати. Це має бути вихід .

Приклад

Візьмемо приклад, про який ми згадували раніше, тобто [1,-12,45,8].

  • Вхід: [1,-12,45,8]
  • Функція: x3 - 12x2 + 45x + 8
  • Похідне -> 3x2 - 24x + 45 + 0 -> [3,-24,45]
  • Розв’язуючи рівняння , отримуємо або .3x2 - 24x + 45 = 0x = 3x = 5
  • Тепер покласти x = 3і x = 5в функції, ми отримуємо значення (62,58).
  • Вихід -> [62,58]

Припущення

  1. Припустимо, що всі вхідні коефіцієнти є цілими числами . Вони можуть бути в порядку збільшення чи зменшенні потужності.

  2. Припустимо, що вхід є принаймні двочленним многочленом . Якщо у многочлена немає цілих розв’язків, ви можете повернути що завгодно.

  3. Припустимо, що кінцевим результатом будуть лише цілі числа.

  4. Ви можете надрукувати результати в будь-якому порядку. Ступінь введеного многочлена не повинна перевищувати 5, щоб ваш код міг обробляти його.

  5. Вхід буде дійсним, щоб рішення x не були точками сідла.

Також ви не змушені це робити похідним методом. Ви можете використовувати будь-який метод, який вам подобається.

Зразок введення та виведення

[2,-8,0] -> (-8)
[2,3,-36,10] -> (91,-34)
[1,-8,22,-24,8] -> (-1,0,-1) 
[1,0,0] -> (0)

Оцінка балів

Це тому найкоротший код виграє.


1
Якщо я правильно розумію: у прикладі крок " Розв’язування рівняння " частково буде цим попереднім завданням ? Також крок " Тепер додавання x = 3 і x = 5 у функцію " означає оригінальну функцію у " Функції ", а не функцію в " Похідна ", правда?
Kevin Cruijssen

1
Для зразка вводу / виводу 3 я отримую (-1, 0, 1), що, на мою думку, є вірною правильною відповіддю ... хоча й не впевнений. Якщо ви не згодні зі мною, пінг мені в чаті.
HyperNeutrino

1
The input will be valid so that the solutions of x are not saddle points, випадок, [1,0,0,3]здається, дає сідлове бачення.
JungHwan Min

1
@JungHwanMin ах, цей приклад було додано до того, як було зроблено правило. Зараз видалено.
Маніш Кунду

1
x^3 - 12x^2 + 45x + 8 = 0 , хоча особисто я вважаю, що ви пишете це як f(x)=x^3-12x^2+45x+8без того, =0тому що =0це не має сенсу, оскільки ми маємо справу з функцією, не розв'язуючи рівняння.
Вейджун Чжоу

Відповіді:


4

Желе , 20 байт

ASŒRḅ@Ðḟ
J’U×µṖÇḅ@€³

Спробуйте в Інтернеті!

Пояснення

ASŒRḅ@Ðḟ     Helper Function; find all integer solutions to a polynomial
             All integer roots are within the symmetric range of the sum of the absolute values of the coefficients
A            Absolute Value (Of Each)
 S           Sum
  ŒR         Symmetric Range; `n -> [-n, n]`
      Ðḟ     Filter; keep elements where the result is falsy for:
    ḅ@       Base conversion, which acts like the application of the polynomial
J’U×µṖÇḅ@€³  Main Link
J                             Range of length
 ’                    Lowered
  U          Reversed
   ×         Multiplied with the original list (last value is 0)
    µ        Begin new monadic chain
     Ṗ       Pop; all but the last element
      Ç      Apply last link (get all integer solutions of the derivative)
       ḅ@€³  Base conversion of the polynomial into each of the solutions; apply polynomial to each solution of the derivative.

Функція помічника в цій програмі була взята з відповіді містера Xcoder тут, яка ґрунтувалася на відповіді Луїса тут


@JungHwanMin Я зазначу це на ОП. Це пряме порушення твердження про те, що точок сідла не буде, тому що похідна від многочлена at 3є 0. редагувати о, ви вже зробили nvm, просто підтвердили коментар тоді
HyperNeutrino

3

JavaScript (ES7), 129 120 байт

Бере коефіцієнти в порядку збільшення потужності.

a=>(g=x=>x+k?(A=g(x-1),h=e=>a.reduce((s,n,i)=>s+n*(e||i&&i--)*x**i,0))()?A:[h(1),...A]:[])(k=Math.max(...a.map(n=>n*n)))

Тестові справи

Прокоментував

a => (                        // given the input array a[]
  g = x =>                    // g = recursive function checking whether x is a solution
    x + k ? (                 //   if x != -k:
      A = g(x - 1),           //     A[] = result of a recursive call with x - 1
      h = e =>                //     h = function evaluating the polynomial:
        a.reduce((s, n, i) => //       for each coefficient n at position i:
          s +                 //         add to s
          n                   //         the coefficient multiplied by
          * (e || i && i--)   //         either 1 (if e = 1) or i (if e is undefined)
          * x**i,             //         multiplied by x**i or x**(i-1)
          0                   //         initial value of s
        )                     //       end of reduce()
      )() ?                   //     if h() is non-zero:
        A                     //       just return A[]
      :                       //     else:
        [h(1), ...A]          //       prepend h(1) to A[]
    :                         //   else:
      []                      //     stop recursion
  )(k = Math.max(             // initial call to g() with x = k = maximum of
    ...a.map(n => n * n)      // the squared coefficients of the polynomial
  ))                          // (Math.abs would be more efficient, but longer)

1
не вдається 0,0,1(x ^ 2 = 0)
betseg

@betseg Дякуємо, що повідомили про це. Виправлено.
Арнольд

3

Джулія 0,6Polynomialsпакетом), 57 байт

using Polynomials
x->map(Poly(x),roots(polyder(Poly(x))))

Спробуйте в Інтернеті!

Приймає коефіцієнти в порядку зростання, тобто перший вхід - це постійний термін.

Приклад виконання:

julia> using Polynomials

julia> g = x -> map(Poly(x), roots(polyder(Poly(x))))
(::#1) (generic function with 1 method)

julia> g([8,45,-12,1])
2-element Array{Float64,1}:
 58.0
 62.0

3

Java 8, 364 239 227 226 218 байт

a->{int l=a.length,A[]=a.clone(),s=0,i,r,f=l,p;for(;f>0;A[--f]*=f);for(int n:A)s+=n<0?-n:n;for(r=~s;r++<s;){for(p=0,i=f=1;i<l;f*=r)p+=A[i++]*f;if(p==0){for(f=i=0;i<l;f+=a[i++]*Math.pow(r,p++));System.out.println(f);}}}

Використовує таку ж функціональність з цієї моєї відповіді.

-8 байт завдяки @ OlivierGrégoire , приймаючи масив у зворотному порядку.

Пояснення:

Спробуйте в Інтернеті.

a->{                  // Method with integer-varargs parameter and integer return-type
  int l=a.length,     //  The length of the input-array
      A[]=a.clone(),  //  Copy of the input-array
      s=0,            //  Sum-integer, starting at 0
      i,              //  Index-integer
      r,              //  Range-integer
      f=l,            //  Factor-integer, starting at `l`
      p;              //  Polynomial-integer
  for(;f>0;           //  Loop over the copy-array
    A[--f]*=f);       //   And multiply each value with it's index
                      //   (i.e. [8,45,-12,1] becomes [0,45,-24,3])
  for(int n:A)        //  Loop over this copy-array:
    s+=n<0?-n:n;      //   And sum their absolute values
  for(r=~s;r++<s;){   //  Loop `r` from `-s` up to `s` (inclusive) (where `s` is the sum)
    for(p=0,          //   Reset `p` to 0
        i=f=1;        //   and `f` to 1
                      //   (`i` is 1 to skip the first item in the copy-array)
        i<l;          //   Inner loop over the input again, this time with index (`i`)
        f*=r)         //     After every iteration: multiply `f` with the current `r`
      p+=             //    Sum the Polynomial-integer `p` with:
         A[i++]       //     The value of the input at index `i`,
               *f;}   //     multiplied with the current factor `f`
    if(p==0){         //   If `p` is now 0:
      for(f=i=0;      //    Use `f` as sum, and reset it to 0
          i<l;        //    Loop over the input-array
        f+=a[i++]*Math.pow(r,p++));
                      //     Fill in `r` in the parts of the input-function
      System.out.println(f);}}}
                      //    And print the sum

2
не вдається 1,0,0(x ^ 2 = 0)
betseg

@betseg Дякую! Фіксований і гольф.
Kevin Cruijssen

1
Ви повинні приймати вхідні дані в зворотному порядку (це явно дозволено) , щоб зменшити кількість , як це: int... ,i, ...; for(;f>0;)A[--f]*=f;. Якщо я не помиляюся, це має заощадити принаймні 4 байти. Якщо ви це зробите, переконайтесь, що інвертуйте всі свої доходи на вхід.
Олів'є Грегоар

@ OlivierGrégoire Спасибі, 8 байтів збережено!
Кевін Кройсейсен





Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.