arcsinc โดยประมาณ


9

เป้าหมายคือง่าย ๆ : ส่งออกวิธีแก้ปัญหาที่ไม่ใช่ศูนย์จริงxกับสมการที่sin(x) = -mxได้รับการป้อนข้อมูลmในจำนวนน้อยที่สุดของไบต์

ข้อมูลจำเพาะ:

  • คำตอบของคุณจะต้องถูกต้องถึง 3 ตัวเลขที่สำคัญ
  • x=0คุณอาจจะส่งออกทางออกที่แท้จริงอื่นใดนอกเหนือจากการแก้ปัญหาที่น่ารำคาญ คุณสามารถสันนิษฐานmได้ว่ามีทางออกอย่างน้อยหนึ่งรายการ m!=0นอกจากนี้คุณยังอาจคิด

เห็นได้ชัดว่าวิธีการแก้ปัญหาหลาม suboptimal ใช้เชื้อสายลาด :

from math import *
from random import *
a=x=0.001
m = 5.
def dE(x):return 2*(sin(x)+m*x+1)*(cos(x)+m)
for i in xrange(1000): x-=dE(x)*a
print x

กรณีทดสอบ

-0.25 -> ±2.4746
-0.1  -> ±2.8523 or ±7.0682 or ±8.4232
 0.2  -> ±4.1046 or ±4.9063 

1
วิธีที่ดีที่สุดที่นี่คือการพิมพ์ค่าคงที่แม้ว่าคุณควรระบุจำนวนทศนิยมที่ต้องการ ผมขอแนะนำให้รวมทั้งพารามิเตอร์สำหรับการป้อนเช่นการแก้a sin(x)=-axโปรดอย่าพูดว่า "คุณต้องคำนวณจริง" เนื่องจากข้อกำหนดเช่นนั้นคลุมเครือเกินกว่าจะทำงานได้
xnor

นอกจากนี้ยังx=0เป็นวิธีแก้ปัญหาเล็กน้อย คุณควรระบุโซลูชันที่คุณต้องการ
xnor

คุณต้องมีขอบเขตบน m เพื่อรับประกันการแก้ปัญหาที่ไม่ใช่ศูนย์
xnor

m=0มีวิธีแก้ปัญหา ( x=kπสำหรับจำนวนเต็มk) ค่าของที่ไม่ได้มีที่ไม่น่ารำคาญแก้ปัญหาที่แท้จริงเป็นผู้ที่อยู่ห่างไกลเกินไปจากm 0
Peter Taylor

1
คุณกำลังมองหาโซลูชันที่มีมูลค่าจริงหรือได้รับอนุญาตให้ใช้โซลูชันที่ซับซ้อนมูลค่าเช่นกันหรือไม่
ไมล์

คำตอบ:


1

ised : 32 28 ไบต์

การใช้การวนซ้ำของนิวตันเริ่มต้นจากπ:

{:x-{sinx+$1*x}/{cosx+$1}:}:::pi

อาร์กิวเมนต์ถูกส่งผ่าน$1ซึ่งสามารถนำมาจากไฟล์เช่นนี้

ised --l inputfile.txt 'code'

รุ่นที่เสถียรน้อยกว่า แต่มีขนาดสั้นกว่า:

{:{x-tanx}/{1+$1/cosx}:}:::pi

บางครั้งมันจะทำซ้ำคำเตือน จำกัด แต่ความถูกต้องดูเหมือนดีเมื่อพิจารณาเงื่อนไข

รุ่น Unicode (จำนวนไบต์เดียวกัน):

{λ{x-tanx}/{1+$1/cosx}}∙π

เริ่มต้นจาก 4 ตัดอีกไบต์และดูเหมือนว่าจะรวมกันเป็นค่าเดียวกัน

{λ{x-tanx}/{1+$1/cosx}}∙4

8

Haskell, 34 ไบต์

f m=until(\x->sin x< -m*x)(+1e-3)0

นับxเพิ่มขึ้นจาก 0 โดย 0.001 sin(x)< -m*xจนกว่า

ตัวอย่าง Ouput

f -0.2 ->   2.595999999999825
f -0.1 ->   2.852999999999797
f  0.0 ->   3.141999999999765
f  0.1 ->   3.4999999999997256
f  0.2 ->   4.1049999999997056

เกี่ยวกับm=-0.1อะไร
Peter Taylor

@PeterTaylor โปรดทราบว่ามันจำเป็น แต่มันให้2.853ซึ่งมีลักษณะที่ถูกต้อง
xnor

แน่นอนว่าพวกเขาทั้งสองฟังก์ชั่นแปลก ๆ ดังนั้นหากมีทางออกก็มีทางออกที่ดี Doh
Peter Taylor

ทำไมคุณต้องตอบคำถามที่คุณรู้ว่าไม่มีความชัดเจน?
Mego

2

Mathematica ขนาด 28 ไบต์

x/.FindRoot[Sinc@x+#,{x,1}]&

x=1ค้นหารากตัวเลขจากการคาดเดาเริ่มต้น กรณีทดสอบ:

% /@ {-0.25, -0.1, 0.2}
(* {2.47458, 2.85234, 4.10462} *)

1

C, 99 ไบต์

#include<math.h>
float f(float m){float x=1,y;do{x=(y=sin(x)+m*x)+x;}while(fabs(y)>1e-4);return x;}

ungolfed:

#include<math.h>
float f(float m){
 float x=1,y;
 do{x=(y=sin(x)+m*x)+x;}while(fabs(y)>1e-4);
 return x;
}

1

MATL , 17 ไบต์

`@2e3/tY,wG_*>}4M

สิ่งนี้ใช้การค้นหาเชิงเส้นบนแกนจริงที่เป็นบวกดังนั้นจึงช้า กรณีทดสอบทั้งหมดสิ้นสุดภายใน 1 นาทีในคอมไพเลอร์ออนไลน์

ลองออนไลน์!

คำอธิบาย

`         % Do...while
  @       %   Push iteration index, starting at 1
  2e3/    %   Divide by 2000
  t       %   Duplicate
  Y,      %   Sine
  w       %   Swap
  G_*     %   Multiply by minus the input
  >       %   Does the sine exceed that? If so, next iteration
}         % Finally (execute after last iteration, before exiting loop)
   4M     %   Push input of sine function again
          % Implicit end
          % Implicit display

1

C ++ 11, 92 91 ไบต์

-1 ไบต์สำหรับการใช้งาน #import

#import<cmath>
using F=float;F f(F m,F x=1){F y=sin(x)+m*x;return fabs(y)>1e-4?f(m,x+y):x;}

0

Python 2, 81 78 ไบต์

การวนซ้ำ Fixpoint

แลมบ์ดาแบบเรียกซ้ำ

from math import*
f=lambda m,x=1:abs(sin(x)+m*x)>1e-4and f(m,sin(x)+m*x+x)or x

ในฐานะวง (81 ไบต์):

from math import*
m=input()
x=1
while abs(sin(x)+m*x)>1e-4:x=sin(x)+m*x+x
print x

0

Mathematica ขนาด 52 ไบต์

NSolve[Sin@x==-x#,x,Reals][[;;,1,2]]~DeleteCases~0.&

ฟังก์ชั่นไม่ระบุชื่อ รับตัวเลขเป็นอินพุตและส่งคืนรายการตัวเลขเป็นเอาต์พุต เพียงใช้NSolveเพื่อแก้สมการโดยประมาณ


หากคุณแทนที่Sin@x==-x#ด้วยSinc@x==-#คุณสามารถทำได้ด้วย~DeleteCases~0.

0

ความจริง 364 ไบต์

bisezione(f,a,b)==(fa:=f(a);fb:=f(b);a>b or fa*fb>0=>"fail";e:=1/(10**(digits()-3));x1:=a;v:=x2:=b;i:=1;y:=f(v);if(abs(y)>e)then repeat(t:=(x2-x1)/2.0;v:=x1+t;y:=f(v);i:=i+1;if i>999 or t<=e or abs(y)<e then break;if fb*y<0 then(x1:=v;fa:=y)else if fa*y<0 then(x2:=v;fb:=y)else break);i>999 or abs(y)>e=>"fail";v)
macro g(m) == bisezione(x+->(sin(x)+m*x), 0.1, 4.3)

ungolf

bisezione(f,a,b)==
    fa:=f(a);fb:=f(b)
    a>b or fa*fb>0=>"fail"
    e:=1/(10**(digits()-3))
    x1:=a;v:=x2:=b;i:=1;y:=f(v)
    if(abs(y)>e) then
      repeat
        t:=(x2-x1)/2.0;v:=x1+t;y:=f(v);i:=i+1
        if i>999 or t<=e or abs(y)<e then break
        if      fb*y<0 then(x1:=v;fa:=y)
        else if fa*y<0 then(x2:=v;fb:=y)
        else break
    i>999 or abs(y)>e=>"fail"
    v

macro g(m) == bisezione(x+->(sin(x)+m*x), 0.1, 4.3)

ผล

(3) -> g(0.2)
   AXIOM will attempt to step through and interpret the code.
   (3)  4.1046198505 579058527
                                                              Type: Float
(4) -> g(-0.1)
   (4)  2.8523418944 500916556
                                                              Type: Float
(5) -> g(-0.25)
   (5)  2.4745767873 698290098
                                                              Type: Float

0

Haskell, 50 ไบต์

ฉันเพิ่งเรียนรู้เกี่ยวกับวิธีการของนิวตันในคลาสการคำนวณของฉันดังนั้นที่นี่ไปในการhaskellใช้วิธีการของนิวตัน

f m=foldl(\x _->x-(sin x+m*x)/(cos x+m))0[1..10]

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