대략적인 arcsinc


9

목표는 간단합니다. input이 주어진 경우 가장 적은 바이트 수로 x방정식에 0이 아닌 실제 솔루션 을 출력 합니다.sin(x) = -mxm

명세서:

  • 답은 유효 숫자 3 자리까지 정확해야합니다.
  • 사소한 솔루션 이외의 실제 솔루션을 출력 할 수 있습니다 x=0. m하나 이상의 솔루션이 존재 한다고 가정 할 수 있습니다. 당신은 또한 가정 할 수 있습니다 m!=0.

그래디언트 디센트를 사용하는 명백히 차선책의 파이썬 솔루션 :

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

0이 아닌 솔루션을 보장하려면 m에 대한 경계가 필요합니다.
xnor

m=0솔루션 ( x=kπinteger k)이 있습니다. m사소한 실제 솔루션이없는 값 은 너무 멀리 떨어져 있습니다 0.
피터 테일러

1
실제 솔루션 만 찾고 있습니까? 아니면 복잡한 솔루션도 허용됩니까?
마일

답변:


1

ised : 32 28 바이트

π에서 시작하여 Newton의 반복 사용 :

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

인수는 $1다음과 같이 파일에서 가져올 수 있습니다.

ised --l inputfile.txt 'code'

조금 덜 안정적이지만 더 짧은 버전 :

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

때로는 반복 제한 경고가 발생하지만 조건을 고려하면 정확도가 좋아 보입니다.

유니 코드 버전 (같은 바이트 수) :

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

4부터 시작하면 다른 바이트가 잘라지고 동일한 값으로 수렴하는 것처럼 보입니다.

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

8

하스켈, 34 바이트

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

x까지 0에서 0.001까지 카운트 업합니다 sin(x)< -m*x.

출력 예

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

물론 둘 다 이상한 함수이므로 솔루션이 있으면 긍정적 인 솔루션이 있습니다. 도
피터 테일러

확실치 않다는 도전에 왜 대답 하시겠습니까?
Mego

2

수학, 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;}

언 골프 :

#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

파이썬 2, 81 78 바이트

수정 점 반복

재귀 람다

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

매스 매 티카, 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)

언 골프

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

하스켈, 50 바이트

방금 calc 클래스에서 newton의 방법에 대해 배웠으므로 haskellnewton의 방법을 사용합니다.

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.