Конференция "Начинающим" » Вычислить синус и косинус
 
  • dmk © (08.04.18 15:03) [0]
    Всем привет. Требуется вычислить синус и косинус.
    Формула известна: Sin A = X/Radius, Cos A = Y/Radius.
    Отсюда вопрос: как получить величину X и Y, если известен только угол?
    Тут картинка: https://yadi.sk/i/UdcTmWDS3UDDGB
  • Pavia © (08.04.18 15:28) [1]
    Если радиус неизвестен, то никак.
    Radius Sin A = X
    Radius Cos A = Y

    А если нужно вычислить Sin A =  и Cos A =
    то надо использовать ряд Тейлора.
    https://ru.wikipedia.org/wiki/Тригонометрические_функции
  • dmk © (08.04.18 16:03) [2]
    Мне надо понять откуда берутся формулы вроде Sqrt(2.0) / 2.0 = 0,7071067....
    Как вычислить откуда взялась двойка и почему надо делить корень из двух на двойку при 45°, например.
  • dmk © (08.04.18 16:04) [3]
    >Если радиус неизвестен, то никак.
    Радиус известен. Он равен единице.
    На крайний случай можно взять любое простое число. Например 7.
  • Pavia © (08.04.18 16:24) [4]
    Из того что углы по 45  следует что X=Y
    Из теоеремы пирфогора R=sqrt(x^+y^2)
    Тогда sin A=X/R=X/sqrt(x^+y^2)
    X/sqrt(2X^2)=x/{sqrt(2)x}=1/sqrt(2)
    домножаем на sqrt(2) числитель и знаменатель
    sqrt(2)/2
  • Redmond (08.04.18 16:29) [5]
    Нагрузить сопроцессор?
    Использовать любое разложение в ряд?
    Завести таблицу готовых ответов?
  • Pavia © (08.04.18 17:04) [6]
  • dmk © (08.04.18 21:29) [7]
    Спс всем. Сделал через ряды Тейлора.
  • Dimka Maslov © (10.04.18 23:29) [8]
    Просто интересно, а чем не угодили функции sin, cos и SinCos?
  • dmk © (11.04.18 09:06) [9]
    >Просто интересно, а чем не угодили функции sin, cos и SinCos?
    Да всем угодили. Просто тему «поковырял». Стало интересно как сделать это без процессора. Оказывается можно.
  • KSergey © (11.04.18 11:24) [10]
    > dmk ©   (11.04.18 09:06) [9]
    > Стало интересно как сделать это без процессора. Оказывается можно.

    Одно мне не понять: почему бы так сразу вопрос и не поставить? ;)

    ("без процессора" - это, конечно, не совсем удачная фраза, в вопросе если бы она была - то всё ушло бы не туда, аккуратнее тут бы надо.)
  • SergP © (11.04.18 23:08) [11]
    Кстати, вот такая штука еще есть, например:

    ...
    var
     a:array[0..200] of extended;

    implementation

    procedure FillArr;
    var
    k:extended;
    i:integer;
    begin
    a[0]:=0;
    a[1]:=0.01;
    k:=1.9996;
    for i:=2 to 200 do a[i]:=k*a[i-1]-a[i-2];
    end;
    ...


    Угадайте, что за массив мы получим?
  • KilkennyCat © (11.04.18 23:35) [12]
    тангенс?
  • dmk © (11.04.18 23:40) [13]
    Вот например так можно:

    //На входе угол в градусах, результат в радианах
    function Sin_Taylor(X: Double): Double;
    const
     OneD: Double = 100000000000000.0; //14 разрядов точности
     OneM: Double = 0.00000000000001;

    var
     N: Integer;
     sqrX, Cur, Ret: Double;
     K, K2: Integer;
     radX: Double;

    begin
     Ret := 0.0;
     radX := NormalizeAngle(X) * DegToRadD;

     N := 10 + 2 * Abs(Trunc(radX));
     radX := TruncD(OneD * radX);
     Cur := radX;
     SQRX := (radX * radX);

     for K := 0 to N do
     begin
       Ret := (Ret + Cur);
       K2 := (K shl 1);
       Cur := FloorDiv(-Cur * SQRX, (K2 + 2) * (K2 + 3) * OneD * OneD);
     end;

     Result := (Ret * OneM);
    end;

    //На входе угол в градусах, результат в радианах
    function Cos_Taylor(X: Double): Double;
    const
     Epsilon: Double = 0.00000000000001;

    begin
     Result := Sin_Taylor(NormalizeAngle(X) - 90.0);
     if Abs(Result) <= Epsilon then Result := 0.0;
    end;


    Функция не моя. Подсказали.
  • dmk © (11.04.18 23:42) [14]
    Теперь вот полиномами занимаюсь. Вариантов вычисления синуса и косинуса вагон и маленькая тележка. Думаю пока какой полином выбрать. Говорят полиномы Чебышёва самые точные в районе нуля.
  • SergP © (12.04.18 00:19) [15]

    > KilkennyCat ©   (11.04.18 23:35) [12]
    >
    > тангенс?


    В данном случае массив синусов с шагом 0,01 (около 0,57 градуса)
  • KilkennyCat © (12.04.18 00:36) [16]

    > SergP ©   (12.04.18 00:19) [15]

    эх,не угадал. я думал, что раз синусы и косинусы уже были, то вероятность тангенса высока )
  • kilkennycat © (12.04.18 00:38) [17]

    > SergP ©   (12.04.18 00:19) [15]

    и, кстати, спасибо. Пригодится.
  • SergP © (12.04.18 10:58) [18]

    > kilkennycat ©   (12.04.18 00:38) [17]
    >
    >
    > > SergP ©   (12.04.18 00:19) [15]
    >
    > и, кстати, спасибо. Пригодится.


    Кстати, тут небольшая ошибочка (из-за нее амплитуда синусоиды уменьшается в 2 раза а частота увеличивается в 2 раза):

    >  k:=1.9996;

    при шаге 0,01 оно должно быть равным 1,9999

    A[0]:=0;       // sin(0)=0
    A[1]:=0.01;   // Берем шаг delta=0.01, A[1]:=sin(delta), а учитывая первый замечательный предел sin(0.01)~0.01
    k=1.9999;   //k:=2*cos(delta) или k:=2*sqrt(1-delta*delta)

  • kilkennycat © (12.04.18 15:37) [19]

    > из-за нее амплитуда синусоиды уменьшается в 2 раза а частота
    > увеличивается в 2 раза

    именно это и нужно.
 
Конференция "Начинающим" » Вычислить синус и косинус
Есть новые Нет новых   [118638   +31][b:0][p:0.001]