Примерный арксинк


9

Цель проста: вывести ненулевое реальное решение xуравнения с sin(x) = -mxучетом входных данных mв наименьшем количестве байтов.

Характеристики:

  • Ваш ответ должен быть верным с 3 значащими цифрами.
  • Вы можете вывести любое реальное решение, кроме тривиального x=0. Можно предположить m, что существует хотя бы одно решение. Вы также можете предположить m!=0.

Очевидно неоптимальное решение Python с использованием градиентного спуска :

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.
Питер Тейлор

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 (тот же bytecount):

{λ{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?
Питер Тейлор

@PeterTaylor Обратите внимание, конечно, если это необходимо, но это дает 2.853, что выглядит правильно.
xnor

Конечно, они обе нечетные функции, поэтому, если есть решение, есть положительное решение. Doh.
Питер Тейлор

Почему вы отвечаете на вызов, который, как вы знаете, неясен?
Мего

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 байт

Итерация с фиксированной точкой

Как рекурсивная лямбда

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 байтов

Я только что узнал о методе Ньютона в своем классе calc, поэтому здесь haskellиспользуется метод Ньютона.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.