Численное интегрирование(проверить код) - C#
Формулировка задачи:
Здравствуйте! Помогите пожалуйста разобраться. Bm всегда выводит значение NaN. Где ошибка? И правильно ли вообще построен код?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static double V0,alfak,fk,lambda,gm,result,a0,b0,a,ak,bk,en,b,rect,e;
static int i,j;
static int nn = 100;
static int ksi = 1;
static double m;
public static double Psi(double m, double ksi)
{
double a = 0.0063f;
double s = 0.2f;
double Gamast = 2.5e6f;
double Tau = 0.09f;
if (ksi <= a * Math.PI / Tau)
return 1 / m - (1 - s) * V0;
else return Gamast / (m * Gamast);
}
public static double P(double x)
{
double h = 0.0104f;
return (2*h*Math.Abs(x))/(Math.Exp(2*Math.Abs(x))-1)*(1-Math.Exp(- Math.Abs(m)));
}
//подынтегральная функция
public static double fx(double x)
{
int y = 0;
double delta = 0.0116f;
double l = 0.2502f;
double Mu0 = 12.56e-7f;
double B0=(2 * Mu0 * Math.Sign(m) * Math.Cosh(m * y)) / ((m - alfak) * Math.Sinh(Math.Abs(m) * delta)) * ((Math.Cos(m * l) - 1) + j * Math.Sin(m * l));
return gm * B0 * fk;
}
//решение методом прямоугольников
private void rectangls()
{
double s1;
double s2;
double h;
int i,n;
n = 100;
do
{
s1=0;
s2=0;
h=(b-a)/n;
for (i=1;i<n;i++)
{
s1=s1+h*fx(h*i-h/2);
}
n=n*2;
h=(b-a)/n;
for (i=1;i<n;i++)
{
s2=s2+h*fx(h*i-h/2);
}
}
while (Math.Abs(s2-s1)<e);
rect=s2;
}
//решение трансцендентного уравнения методом ньютона
private void ras4et()
{
double eps = 0.0001;
for (m = -79.5; m <= 79.5; m++)
{
//a1=0.0063*Math.Pi/0.09
a0 = 0;
b0 = Math.PI / 2;
en = Math.Abs(a - b);
alfak = b - 0.05;
i = 1;
while (Math.Abs(en) > eps)
{
alfak = alfak - f(alfak, m) / f1(alfak, m);
en = Math.Abs(alfak - b);
b = alfak;
}
}
}
//трансцендентное уравнение
private static double f(double alfak, double m)
{
return Math.Tan(alfak) - (Math.Abs(m) / alfak);
}
//его производная
private static double f1(double alfak, double m)
{
return 1 / (Math.Pow(Math.Cos(alfak), 2)) + Math.Abs(m) / Math.Pow(alfak, 2);
}
//расчет суммы Ak и Fk
static void Main()
{
int y = 0;
int ksi = 1;
int Rml = 5;
double Tau = 0.09f;
double a1=a*Math.PI/Tau;
int j = 1;
result=0;
for (m = -79.5; m <= 79.5; m++)
{
gm=P(m)*Psi(m,ksi);
lambda = (alfak * alfak + m * m) / (Math.Abs(m) * Math.Abs(gm));
bk = Math.Sign(lambda) * rect;
ak=(lambda*bk)/(lambda+j*Rml);
fk=((2*alfak)/(2*alfak*a1+Math.Sin(2*alfak)*a1*Math.Abs(gm))*Math.Cos(alfak)*y);
result=result+ak*fk;
Console.WriteLine("Bm = {0}", result);
}
Console.ReadKey();
Console.WriteLine();
}
}
}Решение задачи: «Численное интегрирование(проверить код)»
textual
Листинг программы
class Program
{
public delegate double Function(double x);
public static double Rectangular(Function f, double a, double b, int n)
{
double sum = 0.0;
double h = (b - a) / n;
for (int i = 0; i < n; i++)
{
sum += h * f(a + i * h);
}
return sum;
}
public static double Rectangular(double[] y, double a, double b, int n)
{
double sum = 0.0;
double h = (b - a) / n;
for (int i = 0; i < n; i++)
{
sum += h * y[i];
}
return sum;
}
static double f(double x)
{
return Math.Sin(x);
}
static double df(double x)
{
return Math.Cos(x);
}
static void Main(string[] args)
{
int n = 1000;
double result;
double a = 0.0;
double b = 1.0;
Console.WriteLine("\nTesting Rectangular method for integral(df(x)) = f(x) where");
Console.WriteLine("f(x) = sin(x), df(x) = cos(x) and a=0 to b=1.\n");
result = f(b) - f(a);
Console.WriteLine("Analytic result = " + result.ToString());
result = Rectangular(df, a, b, n);
Console.WriteLine("Result using function = " + result.ToString());
double[] y = new double[n];
double h = (b - a) / (n - 1);
for (int i = 0; i < n; i++)
{
double x = i * h;
y[i] = df(x);
}
result = Rectangular(y, a, b, n);
Console.WriteLine("Result using data array = " + result.ToString());
Console.ReadLine();
}
}