private Tuple <Vectors, double, double> HalfSolve(int len) { SqMatrix iD1 = D1.SubMatrix(len), iD2 = D2.SubMatrix(len), iS = S.SubMatrix(len); Vectors iR1 = R1.SubVector(len), iR2 = R2.SubVector(len); SqMatrix iD1m = D1m.SubMatrix(len), iD2m = D2m.SubMatrix(len), idl; Vectors idr; idl = (D2 - S * (D1m * S)).SubMatrix(len); idr = (R2 + S * D1m * R1).SubVector(len); Vectors id = idl.Solve(idr), icnew = (D1m * (R1 + S * id)).SubVector(len); Vectors res = Vectors.Union2(icnew, id); double p1 = IntegralClass.IntegralCurve((Point y) => (TestFuncAndCurve.Grads[GF - 1](y) * TestFuncAndCurve.Norm[CIRCLE - 1](y)).Sqr(), CIRCLE - 1); double p2 = IntegralClass.IntegralCurve((Point y) => (U(y)).Sqr(), CIRCLE - 1); Functional fif = (Point x) => { double s = 0; for (int i = 0; i < id.Deg; i++) { s += icnew[i] * alpha(x, i) + id[i] * beta(x, i); } return(Math.Abs(s - KursMethods.U(x))); }; double L = IntegralClass.Integral(fif, CIRCLE - 1); $"len = {len}, L = {this.F(res)}".Show(); return(new Tuple <Vectors, double, double>(res, F(res), L)); }
public void TestInteg() { Vectors ce = Vectors.Random(dim, -5, 9); Vectors de = Vectors.Random(dim, -5, 5); Func <double> FF = () => { Functional f1 = (Point y) => { double sum = U(y); for (int i = 0; i < dim; i++) { sum -= ce[i] * alpha(y, i) + de[i] * beta(y, i); } return(sum * sum); }; Functional f2 = (Point y) => { double sum = Unu(y); for (int i = 0; i < dim; i++) { sum -= ce[i] * alphanu(y, i) + de[i] * betanu(y, i); } return(sum * sum); }; return(IntegralClass.IntegralCurve((Point p) => f1(p) + f2(p), CIRCLE - 1)); }; $"Погрешность представления 1){FF()} 2){F(Vectors.Union2(ce,de))}".Show(); }
/// <summary> /// Созадть систему матриц и векторов по базисным функция /// </summary> /// <param name="n">Число базисных функций. Если -1, то берутся все функции</param> public BiharmonicEquation(int n = -1) { if (n == -1) { n = masPoints.Length; } D1 = new SqMatrix(n); D2 = new SqMatrix(n); S = new SqMatrix(n); R1 = new Vectors(n); R2 = new Vectors(n); Parallel.For(0, n, (int i) => { for (int j = i; j < n; j++) { D1[i, j] = IntegralClass.IntegralCurve((Point x) => alpha(x, i) * alpha(x, j) + alphanu(x, i) * alphanu(x, j), CIRCLE - 1); D2[i, j] = IntegralClass.IntegralCurve((Point x) => beta(x, i) * beta(x, j) + betanu(x, i) * betanu(x, j), CIRCLE - 1); S[i, j] = IntegralClass.IntegralCurve((Point x) => alpha(x, i) * beta(x, j) + alphanu(x, i) * betanu(x, j), CIRCLE - 1); } R1[i] = IntegralClass.IntegralCurve((Point y) => alphanu(y, i) * Unu(y) + alpha(y, i) * U(y), CIRCLE - 1); R2[i] = IntegralClass.IntegralCurve((Point y) => betanu(y, i) * Unu(y) + beta(y, i) * U(y), CIRCLE - 1); for (int j = i + 1; j < n; j++) { D1[j, i] = D1[i, j]; D2[j, i] = D2[i, j]; S[j, i] = S[i, j]; } }); d = new Vectors(n); cnew = new Vectors(n); ErrorsMasL = new double[n]; ErrorsMasQ = new double[n]; p1 = IntegralClass.IntegralCurve((Point y) => Unu(y).Sqr(), CIRCLE - 1); p2 = IntegralClass.IntegralCurve((Point y) => U(y).Sqr(), CIRCLE - 1); $"p1 = {p1}, p2 = {p2}".Show(); var mems = new Memoize <Point, Vectors[]>((Point p) => { Vectors[] r = new Vectors[4]; for (int i = 0; i < 4; i++) { r[i] = new Vectors(dim); } for (int i = 0; i < dim; i++) { r[0][i] = alpha(p, i); r[1][i] = alphanu(p, i); r[2][i] = beta(p, i); r[3][i] = betanu(p, i); } return(r); }).Value; Func <Point, Vectors[]> AB = (Point p) => mems(p); Func <Vectors, double> FF = (Vectors v) => { Vectors ce = new Vectors(this.dim); Vectors de = new Vectors(this.dim); for (int i = 0; i < v.Deg / 2; i++) { ce[i] = v[i]; de[i] = v[i + v.Deg / 2]; } Functional func = (Point p) => { var vec = AB(p); return((U(p) - ce * vec[0] - de * vec[2]).Sqr() + (Unu(p) - ce * vec[2] - de * vec[3]).Sqr()); }; return(IntegralClass.IntegralCurve(func, CIRCLE - 1)); Functional f1 = (Point y) => { double sum = U(y); for (int i = 0; i < dim; i++) { sum -= ce[i] * alpha(y, i) + de[i] * beta(y, i); } return(sum * sum); }; Functional f2 = (Point y) => { double sum = Unu(y); for (int i = 0; i < dim; i++) { sum -= ce[i] * alphanu(y, i) + de[i] * betanu(y, i); } return(sum * sum); }; return(IntegralClass.IntegralCurve((Point p) => f1(p) + f2(p), CIRCLE - 1)); }; F = (Vectors v) => { return(FF(v)); Vectors cc = new Vectors(this.dim); Vectors dd = new Vectors(this.dim); for (int i = 0; i < v.Deg / 2; i++) { cc[i] = v[i]; dd[i] = v[i + v.Deg / 2]; } int k = this.dim; double sum = p1 + p2 - 2 * (cc * R1 + dd * R2); for (int i = 0; i < k; i++) { for (int j = 0; j < k; j++) { sum += 2 * cc[i] * dd[j] * S[i, j] + cc[i] * cc[j] * D1[i, j] + dd[i] * dd[j] * D2[i, j]; } } return(sum); }; Vectors tmp = Vectors.Union2(new Vectors(dim), Vectors.Random(dim, -4, 4)); $"Error! {FF(tmp)} != {F(tmp)}".Show(); // Parallel.Invoke( //() => D1m = D1.Invertion, //() => D2m = D2.Invertion //); // dl = D2 - S * (D1m * S); // dr = R2 + S * D1m * R1; // slau = new SLAU(dl, dr); }