Численное интегрирование(проверить код) - 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(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д