//龙贝格表格 public void Romberg(double a, double b, FuncOfOneVar F) { double[,] TCSR = new double[20, 6]; for (int i = 0; i < 5; i++) { TCSR[i, 0] = Math.Pow(2, i); if (TiXing(a, b, (int)TCSR[i, 0], out double y, F)) { TCSR[i, 1] = y; } if (i > 0) { TCSR[i, 2] = (4 * TCSR[i, 1] - TCSR[i - 1, 1]) / 3; if (i > 1) { TCSR[i, 3] = (16 * TCSR[i, 2] - TCSR[i - 1, 2]) / 15; if (i > 2) { TCSR[i, 4] = (64 * TCSR[i, 3] - TCSR[i - 1, 3]) / 63; } } } } for (int i = 0; i < 5; i++) { Console.WriteLine($"i: {i}\tn: {TCSR[i, 0]}\t" + $"T: {TCSR[i, 1]}\tS: {TCSR[i, 2]}\t" + $"C: {TCSR[i, 3]}\tR: {TCSR[i, 4]}"); } }
//二分法计算 public void Bs(double a, double b, double ep, FuncOfOneVar function) { // int num = 2; //二分循环 while (b - a >= ep) { num *= 2; double x = (b + a) / 2.0; if (function(x, out double y1) && function(a, out double y2) && y1 * y2 > 0) { a = x; } else { b = x; } } //生成计算误差 //生成计算结果 //生成输出字符串 Console.WriteLine($"\t计算误差: {(b - a) / num}\t计算结果: {(b + a) / 2.0}"); }
public Function(FuncOfOneVar _Function, double _min, bool _minAllow, double _max, bool _maxAllow)//构造函数2 { function = _Function; valueMin = _min; minAllow = _minAllow; valueMax = _max; maxAllow = _maxAllow; }
public Function(FuncOfOneVar mainFunction, double min, double max)//构造函数2 { function = mainFunction; valueMin = min; minAllow = false; valueMax = max; maxAllow = false; }
//逐次分半加速 public void QuBanTiXing(double a, double b, double ep, FuncOfOneVar F) { n = 1; double Tn, T2n; Tn = 0; while (true) { this.TiXing(a, b, n, out T2n, F); Console.WriteLine("n: {" + n + "}\tT2n: {" + T2n + "+}\t|T2n-Tn|: {" + Math.Abs(T2n - Tn) / 3 + "}"); if (Math.Abs((T2n - Tn) / 3) > ep) { Tn = T2n; n = n * 2; } else { break; } } }
private bool TiXing(double a, double b, int n, out double res, FuncOfOneVar F) { h = (b - a) / n; double sum = 0; F(a, out double fa); F(b, out double fb); for (int i = 1; i < n; i++) { if (F(a + i * h, out double s)) { sum += s; } else { Console.WriteLine($"错误:梯形公式计算错误"); res = 0; return(false); } } res = h / 2 * (fa + fb + sum * 2); return(true); }
//构造函数 public Function(FuncOfOneVar mainFunction)//构造函数1 { valueMin = double.MinValue; valueMax = double.MaxValue; function = mainFunction; }