Преобразование угла MATLAB() в C#

Я хочу передать на C# функцию, которая вычисляет векторный угол выражения из MATLAB, angle(). Я обнаружил, что angle(x+yi)=atan2(y,x), но вот моя проблема, у меня есть квадратный корень, который в зависимости от значений, которые я даю, является либо положительным, либо отрицательным. Но в MATLAB, если функция sqrt получает отрицательное значение, она возвращает воображаемое, в отличие от C#, где она возвращает NaN.

Итак, как я могу заставить два кода давать одинаковый результат?

т.е. МАТЛАБ:

angle(a*1i-sqrt(expression))

C#:

Mathf.Atan2(a,-sqrt(expression))(что я делаю и считаю неправильным)


person hey    schedule 21.08.2016    source источник
comment
помогите мне с названием кто нибудь   -  person hey    schedule 21.08.2016
comment
Возьмите абсолютное значение выражения. Помните из младших классов средней школы CAST. Косинус положителен в 4-м квадранте, все функции положительны в 1-м квадранте, синус положителен во 2-м квадранте, тангенс положителен в 3-м квадранте.   -  person jdweng    schedule 21.08.2016
comment
@jdweng я думаю, что так не пойдет, в Matlab sqrt (отрицательные) дают мнимое число, которое используется для расчетов, используя значение abs, я изменяю результат так, что С# не будет вести себя как Matlab   -  person hey    schedule 21.08.2016
comment
На самом деле нет никакой разницы между ax+by и ax+bi, если вы понимаете, что ось i равна sqrt -1. Математика такая же.   -  person jdweng    schedule 21.08.2016
comment
@jdweng Ну, я не совсем понимаю, что вы пытаетесь мне сказать, но для тестирования я переместил sqrt (выражение), в то время как выражение имеет отрицательное значение, что означает, что sqrt возвращает мнимое, так что c # соответствует: Mathf.Atan2 (a -sqrt(abs(expression)),0)(чей результат всегда равен pi/2) и результат для Matlab был одинаковым для одного и того же ввода, поэтому я предполагаю, что sqrt в С# должен изменить положение параметра в зависимости от знака выражения , возможно, с помощью простого оператора if. Я сделал то, что вы сказали мне, что я понимаю как: Mathf.Atan2 (a, -sqrt (abs (выражение))) и не дал таких же результатов.   -  person hey    schedule 21.08.2016
comment
Я делаю то, что вы предложили?   -  person hey    schedule 21.08.2016
comment
Опубликуйте входные и выходные значения, которые вы получаете, чтобы я мог видеть ошибку. Да, вам нужно if в С#, в зависимости от того, какое выражение положительное или отрицательное.   -  person jdweng    schedule 21.08.2016
comment
Вы можете использовать структуру "System.Numerics.Complex" и ее методы (например, "Complex.Sqrt").   -  person ArgusMagnus    schedule 21.08.2016
comment
@jdweng я понял, что вы мне сказали b4, ArgusMagnus, спасибо вам обоим за помощь   -  person hey    schedule 21.08.2016


Ответы (1)


Вы можете сделать то же самое, что и Matlab, и использовать сложную математику:

using System.Numerics;

public static class Foo
{
    public static double GetAngle(double a, double expression)
    {
        Complex cA = new Complex(0, a);
        Complex sqrt = Complex.Sqrt(expression);
        Complex result = cA - sqrt;
        return result.Phase;
    }
}

Если вы не хотите этого делать, вы можете видеть, что sqrt(expression) — это число на (положительной) мнимой оси, если expression отрицательное значение, что означает, что a*i-sqrt(Expression) == (a-sqrt(abs(expression)))*i фаза которого равна пи/2 или 3*пи/2:

public static class Foo
{
    public static double GetAngle(double a, double expression)
    {
        if (expression < 0.0)
        {
            double result = a - Math.Sqrt(-expression);
            if (result > 0.0)
                return Math.PI * 0.5;
            else if (result < 0.0)
                return Math.PI * 1.5;
            else
                return 0.0;
        }
        else
            return Math.Atan2(a, -Math.Sqrt(expression));
    }
}
person ArgusMagnus    schedule 21.08.2016
comment
да, мне это нравится, спасибо, я видел сложную структуру, но я думал, что она будет более сложной, чем кажется в вашем примере, это то, что мне нужно было увидеть, еще раз спасибо за ваше время - person hey; 21.08.2016