ค้นหา Maxima ท้องถิ่นและ Minima


14

คำนิยาม

maxima และ minima ของฟังก์ชั่นที่กำหนดเป็นค่าที่ใหญ่ที่สุดและน้อยที่สุดของฟังก์ชั่นทั้งในช่วงที่กำหนดหรือภายในโดเมนทั้งหมดของฟังก์ชั่น

ท้าทาย

ความท้าทายคือการหาสิ่งที่สูงสุดในท้องถิ่นและต่ำสุดของฟังก์ชันพหุนามให้ใช้วิธีการใด ๆ ที่คุณอาจชอบ ไม่ต้องกังวลฉันจะพยายามทำให้ดีที่สุดเพื่ออธิบายการท้าทายและทำให้มันง่ายที่สุดเท่าที่จะทำได้

อินพุตจะมีสัมประสิทธิ์ทั้งหมดของพหุนามตัวแปรเดียวไม่ว่าจะเป็นการลดหรือเพิ่มลำดับพลังงาน (ขึ้นอยู่กับคุณ) ตัวอย่างเช่น,

  • [3,-7,1] จะเป็นตัวแทนของ 3x2 - 7x + 1 = 0
  • [4,0,0,-3] จะเป็นตัวแทนของ 4x3-3=0.

วิธีการแก้ปัญหา (ใช้อนุพันธ์)

ตอนนี้ขอบอกว่าการป้อนข้อมูลของเราคือ[1,-12,45,8]ซึ่งเป็นอะไร แต่ฟังก์ชั่นx3 - 12x2 + 45x + 8

  1. ภารกิจแรกคือการหาอนุพันธ์ของฟังก์ชันนั้น เนื่องจากเป็นฟังก์ชันพหุนามดังนั้นจึงเป็นเรื่องง่ายที่จะทำ

    อนุพันธ์ของมี เงื่อนไขคงที่ใด ๆ ที่มีอยู่จะถูกคูณด้วย นอกจากนี้หากมีการบวก / ลบคำศัพท์อนุพันธ์ของพวกเขาจะถูกเพิ่มหรือลบตามลำดับ จำไว้ว่าอนุพันธ์ของค่าตัวเลขคงที่ใด ๆ คือศูนย์ นี่คือตัวอย่างบางส่วน: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. ทีนี้แก้สมการโดยการใส่พหุนามใหม่ไปที่ศูนย์แล้วรับค่าอินทิกรัลของ x

  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. สมมติการป้อนข้อมูลเป็นอย่างน้อยพหุนาม 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
สำหรับตัวอย่าง I / O 3 ฉันได้รับ(-1, 0, 1)ซึ่งฉันเชื่อว่าเป็นคำตอบที่ถูกต้องจริง ... ไม่แน่ใจ หากคุณไม่เห็นด้วยกับฉัน ping ฉันในการแชท
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 อาเพิ่มตัวอย่างนั้นก่อนที่จะสร้างกฎ นำออกแล้ว
Manish Kundu

1
x^3 - 12x^2 + 45x + 8 = 0แม้ส่วนตัวผมชอบที่คุณเขียนว่ามันเป็นf(x)=x^3-12x^2+45x+8โดยไม่ต้อง=0เพราะ=0ไม่ได้ทำให้รู้สึกตั้งแต่เราจะจัดการกับฟังก์ชั่นที่ไม่แก้สมการ
Weijun Zhou

คำตอบ:


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.

ฟังก์ชั่นผู้ช่วยในโปรแกรมนี้นำมาจากคำตอบของ Mr. Xcoder ที่นี่ซึ่งอ้างอิงจากคำตอบของ Luis ที่นี่


@JungHwanMin ฉันจะชี้ไปที่ OP นั่นคือการละเมิดโดยตรงของคำสั่งว่าจะไม่มีจุดอานเพราะอนุพันธ์ของพหุนามที่มี3 แก้ไขแหมคุณทำ nvm แล้วเพิ่งเพิ่มความคิดเห็นแล้ว0
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 ขอบคุณที่รายงานสิ่งนี้ แก้ไขแล้ว.
Arnauld

3

Julia 0.6 (พร้อมPolynomialsแพ็คเกจ), 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 ไบต์ หากคุณทำสิ่งนี้ตรวจสอบให้แน่ใจว่าได้กลับการเข้าถึงอินพุตทั้งหมดของคุณ
Olivier Grégoire

@ OlivierGrégoireขอบคุณ 8 ไบต์ที่บันทึกไว้!
Kevin Cruijssen





โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.