Yaklaşık yay


9

Amaç basit: En az sayıda baytta girdi olarak verilen xdenkleme sıfır olmayan gerçek bir çözüm çıktısı .sin(x) = -mxm

Özellikler:

  • Cevabınız 3 önemli rakama doğru olmalıdır.
  • Önemsiz çözüm dışında herhangi bir gerçek çözüm üretebilirsiniz x=0. mEn azından bir çözümün var olduğunu varsayabilirsiniz . Ayrıca varsayabilirsin m!=0.

Degrade iniş kullanan açıkça düşük bir python çözümü :

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

Test senaryoları

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

1
Buradaki en iyi yaklaşım, sabit bir değer yazdırmaktır, ancak kaç ondalık basamak gerektiğini belirtmeniz gerekir. Bir giriş parametresi eklemeyi öneririm, açözmek isterim sin(x)=-ax. Bunun gibi gereksinimler çalışmak için çok belirsiz olduğundan, lütfen "bunu gerçekten hesaplamanız gerekir" demeyin.
xnor

Ayrıca, x=0önemsiz bir çözümdür. Hangi çözümü istediğinizi belirtmelisiniz.
xnor

Sıfır olmayan bir çözümü garanti etmek için m'de bazı sınırlara ihtiyacınız vardır.
xnor

m=0çözümleri vardır ( x=kπtamsayı için k). Değerleri mönemsiz olmayan gerçek çözümlere sahip olmayanlar, çok uzak olanlardır 0.
Peter Taylor

1
Sadece gerçek değerli çözümler mi arıyorsunuz yoksa karmaşık değerli çözümlere de mi izin veriyorsunuz?
mil

Yanıtlar:


1

Ised : 32 28 bayt

Starting'dan başlayarak Newton yinelemesini kullanma:

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

$1Bir dosyadan alınabilen argüman şöyle aktarılır :

ised --l inputfile.txt 'code'

Biraz daha az kararlı, ancak daha kısa versiyon:

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

Bazen yineleme sınırı uyarıları atar, ancak koşullar dikkate alındığında doğruluk iyi görünür.

Unicode sürümü (aynı bayt sayısı):

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

4'ten başlayarak başka bir bayt keser ve aynı değerlere yakınsar gibi görünüyor

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

8

Haskell, 34 bayt

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

x0'dan 0,001'e kadar sayar sin(x)< -m*x.

Çıkış örnekleri

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

Ne olmuş m=-0.1?
Peter Taylor

@PeterTaylor Gerekli olup olmadığından emin olun, ancak 2.853doğru görünüyor.
xnor

Tabii ki, ikisi de tuhaf işlevler, bu yüzden bir çözüm varsa olumlu bir çözüm var. Hamuru.
Peter Taylor

Neden belirsiz olduğunu bildiğiniz bir soruna cevap veriyorsunuz?
Mego

2

Mathematica, 28 bayt

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

İlk tahminde sayısal bir kök arar x=1. Test senaryoları:

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

1

C, 99 bayt

#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 bayt

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

Bu, pozitif gerçek eksende doğrusal aramayı kullanır, bu nedenle yavaştır. Tüm test senaryoları çevrimiçi derleyicide 1 dakika içinde sona erer.

Çevrimiçi deneyin!

açıklama

`         % 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 bayt

-1 bayt kullanım için #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 bayt

Düzeltme noktası yinelemesi

Özyinelemeli lambda olarak

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

Döngü olarak (81 bayt):

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 bayt

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

Anonim işlev. Girdi olarak bir sayı alır ve çıktı olarak bir sayı listesi döndürür. Sadece NSolveyaklaşık denklemi çözmek için kullanır .


Eğer Sin@x==-x#ile değiştirirsenizSinc@x==-#~DeleteCases~0.

0

Aksiyom, 364 bayt

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)

Sonuçlar

(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 bayt

Kireç sınıfımda Newton'un yöntemini yeni öğrendim, işte haskellNewton'un yöntemini kullanmaya başladım .

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.