#c# #math #math.net #bessel-functions
#c# #математика #math.net #бессель-функции
Вопрос:
Мне нужно использовать функцию Бесселя первого рода в unity3d (используя c #). После попытки использовать mathnet.numerics .dll в unity я обнаружил много ошибок, по-видимому, из-за того, что unity3d не поддерживает .NET 4. Затем я решил использовать декомпилятор jetbrains dotPeek для поиска источника функций Бесселя.
Однако функция Бесселя выдает неверный вывод, и, честно говоря, математика выше моего уровня оплаты, поэтому отладка была очень сложной. Может ли кто-нибудь увидеть какие-либо ошибки в том, что я использовал.
например, результат с x = 20 равен 43558282.5571362, где предполагается, что он равен 0.167025
public static double BesselI0(double x)
{
if (x < 0.0)
x = -x;
if (x <= 8.0)
{
double x1 = x / 2.0 - 2.0;
return Math.Exp(x) * ChebyshevA(BesselI0A, x1);
}
else
{
double x1 = 32.0 / x - 2.0;
return Math.Exp(x) * ChebyshevA(BesselI0B, x1) / Math.Sqrt(x);
}
}
internal static double ChebyshevA(double[] coefficients, double x)
{
int num1 = 0;
double[] numArray = coefficients;
int index = num1;
int num2 = 1;
int num3 = index num2;
double num4 = numArray[index];
double num5 = 0.0;
int num6 = coefficients.Length - 1;
double num7;
do
{
num7 = num5;
num5 = num4;
num4 = x * num5 - num7 coefficients[num3 ];
}
while (--num6 > 0);
return 0.5 * (num4 - num7);
}
private static readonly double[] BesselI0A = new double[30]
{
-4.41534164647934E-18,
3.33079451882224E-17,
-2.43127984654795E-16,
1.71539128555513E-15,
-1.16853328779935E-14,
7.67618549860494E-14,
0.0 / 1.0,
0.0 / 1.0,
0.0 / 1.0,
0.0 / 1.0,
-5.18979560163526E-10,
2.65982372468239E-09,
-1.30002500998625E-08,
6.04699502254192E-08,
-2.67079385394061E-07,
1.1173875391201E-06,
-4.41673835845875E-06,
1.64484480707289E-05,
-5.7541950100821E-05,
0.000188502885095842,
-0.000576375574538582,
0.00163947561694134,
-0.00432430999505058,
0.010546460394595,
-0.0237374148058995,
0.0493052842396707,
-0.0949010970480476,
0.171620901522209,
-0.304682672343198,
0.676795274409476
};
private static readonly double[] BesselI0B = new double[25]
{
-7.23318048787475E-18,
-4.83050448594418E-18,
4.46562142029676E-17,
3.46122286769746E-17,
-2.82762398051658E-16,
-3.42548561967722E-16,
1.77256013305653E-15,
3.81168066935262E-15,
-9.55484669882831E-15,
-4.15056934728722E-14,
1.54008621752141E-14,
0.0 / 1.0,
0.0 / 1.0,
0.0 / 1.0,
0.0 / 1.0,
0.0 / 1.0,
0.0 / 1.0,
4.94060238822497E-10,
3.39623202570839E-09,
2.26666899049818E-08,
2.04891858946906E-07,
2.89137052083476E-06,
6.88975834691682E-05,
0.00336911647825569,
0.804490411014109
};
Комментарии:
1. Не вдаваясь в подробности (по общему признанию, мое исчисление выходит за рамки rusty), пытались ли вы проверить правильность вашего порядка операций? Я видел довольно много проблем с математическими функциями, возвращающими неожиданные результаты просто из-за порядка операций.
2. Я попробую это проверить. Спасибо
3. Вы уверены, что это правильная функция? Функции Бесселя первого и второго рода обычно обозначаются через J и Y, в то время как модифицированные функции Бесселя первого и второго рода обычно обозначаются через I и K.
4. Также Math.net ( здесь тоже ) утверждает, что они поддерживают .NET 3.5.
5. Извините всех, я просматривал документацию. Код был для модифицированной функции Бесселя. Не функция Бесселя. Спасибо
Ответ №1:
Если вы пытаетесь использовать функцию Бесселя, а не модифицированную функцию Бесселя, вам следует искать BesselJ, а не BesselI . Однако я не нашел такого в этой библиотеке.