Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define N 25
- #include <stdio.h>
- #include <math.h>
- #include <Core>
- #include <Dense>
- #include <IterativeLinearSolvers>
- using namespace Eigen;
- double b[N*N*N] = {0};
- double u[N*N*N] = {0};
- double p[N*N*N] = {0};
- int EqNum;
- double F (int i, int j, int k){
- double H = 2.0/(N+1);
- double x = -1 + (i+1)*H;
- double y = -1 + (j+1)*H;
- double z = -1 + (k+1)*H;
- return 100*(1-z*z)*(1-z*z)*(1-y*y)*(1-x*x);
- }
- double f(int i, int j, int k) {
- double H = 2.0/(N+1);
- double x = -1 + (i+1)*H;
- double y = -1 + (j+1)*H;
- double z = -1 + (k+1)*H;
- return 100*(4 *(x*x - 1)*(y*y - 1)*(3*z*z - 1) + 2*(x*x - 1)*(1 - z*z)*(1 - z*z)+ 2*(y*y - 1)*(1 - z*z)*(1 - z*z));
- }
- double CoefA(int EqNum, int CoefNum){
- int i = CoefNum / (N*N);
- int j = CoefNum % (N*N) / N;
- int k = CoefNum % N;
- if ((EqNum != CoefNum) && (EqNum != CoefNum + 1) && (EqNum != CoefNum - 1) && (EqNum != CoefNum + N) && (EqNum != CoefNum - N)&& (EqNum != CoefNum + N*N) && (EqNum != CoefNum - N*N)) return 0;
- //Внутренние узлы
- if ((i != 0) && (j != 0) && (k != 0) && (i != N - 1) && (j != N - 1) && (k != N - 1)) {
- if (EqNum == CoefNum) return -6;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 1;
- }
- //Грани
- if ((i == 0) && (j != 0) && (k != 0) && (j != N - 1) && (k != N - 1)) {
- if (EqNum == CoefNum) return -6;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 0;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 1;
- }
- if ((i == N - 1) && (j != 0) && (k != 0) && (j != N - 1) && (k != N - 1)) {
- if (EqNum == CoefNum) return -6;
- if (EqNum == CoefNum + N*N) return 0;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 1;
- }
- if ((j == 0) && (i != 0) && (k != 0) && (i != N - 1) && (k != N - 1)) {
- if (EqNum == CoefNum) return -6;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 0;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 1;
- }
- if ((j == N - 1) && (i != 0) && (k != 0) && (i != N - 1) && (k != N - 1)) {
- if (EqNum == CoefNum) return -6;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 0;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 1;
- }
- if ((k == 0) && (i != 0) && (j != 0) && (i != N - 1) && (j != N - 1)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 0;
- }
- if ((k == N - 1) && (i != 0) && (j != 0) && (i != N - 1) && (j != N - 1)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 0;
- if (EqNum == CoefNum - 1) return 1;
- }
- //Рёбра
- if ((i == 0) && (j == 0) && (k != 0) && (k != N - 1)) {
- if (EqNum == CoefNum) return -6;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 0;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 0;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 1;
- }
- if ((i == 0) && (j == N - 1) && (k != 0) && (k != N - 1)) {
- if (EqNum == CoefNum) return -6;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 0;
- if (EqNum == CoefNum + N) return 0;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 1;
- }
- if ((i == N - 1) && (j == 0) && (k != 0) && (k != N - 1)) {
- if (EqNum == CoefNum) return -6;
- if (EqNum == CoefNum + N*N) return 0;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 0;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 1;
- }
- if ((i == N - 1) && (j == N - 1) && (k != 0) && (k != N - 1)) {
- if (EqNum == CoefNum) return -6;
- if (EqNum == CoefNum + N*N) return 0;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 0;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 1;
- }
- if ((i == 0) && (k == 0) && (j != 0) && (j != N - 1)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 0;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 0;
- }
- if ((i == 0) && (k == N - 1) && (j != 0) && (j != N - 1)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 0;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 0;
- if (EqNum == CoefNum - 1) return 1;
- }
- if ((i == N - 1) && (k == 0) && (j != 0) && (j != N - 1)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 0;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 0;
- }
- if ((i == N - 1) && (k == N - 1) && (j != 0) && (j != N - 1)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 0;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 0;
- if (EqNum == CoefNum - 1) return 1;
- }
- if ((j == 0) && (k == 0) && (i != 0) && (i != N - 1)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 0;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 0;
- }
- if ((j == 0) && (k == N - 1) && (i != 0) && (i != N - 1)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 0;
- if (EqNum == CoefNum + 1) return 0;
- if (EqNum == CoefNum - 1) return 1;
- }
- if ((j == N - 1) && (k == 0) && (i != 0) && (i != N - 1)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 0;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 0;
- }
- if ((j == N - 1) && (k == N - 1) && (i != 0) && (i != N - 1)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 0;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 0;
- if (EqNum == CoefNum - 1) return 1;
- }
- //Узлы, примыкающие к вершинам
- if ((i == 0) && (j == 0) && (k == 0)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 0;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 0;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 0;
- }
- if ((i == N - 1) && (j == 0) && (k == 0)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 0;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 0;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 0;
- }
- if ((i == 0) && (j == N - 1) && (k == 0)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 0;
- if (EqNum == CoefNum + N) return 0;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 0;
- }
- if ((i == 0) && (j == 0) && (k == N - 1)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 0;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 0;
- if (EqNum == CoefNum + 1) return 0;
- if (EqNum == CoefNum - 1) return 1;
- }
- if ((i == N - 1) && (j == N - 1) && (k == 0)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 0;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 0;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 1;
- if (EqNum == CoefNum - 1) return 0;
- }
- if ((i == 0) && (j == N - 1) && (k == N - 1)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 1;
- if (EqNum == CoefNum - N*N) return 0;
- if (EqNum == CoefNum + N) return 0;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 0;
- if (EqNum == CoefNum - 1) return 1;
- }
- if ((i == N - 1) && (j == 0) && (k == N - 1)) {
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 0;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 1;
- if (EqNum == CoefNum - N) return 0;
- if (EqNum == CoefNum + 1) return 0;
- if (EqNum == CoefNum - 1) return 1;
- }
- if (EqNum == CoefNum) return -5;
- if (EqNum == CoefNum + N*N) return 0;
- if (EqNum == CoefNum - N*N) return 1;
- if (EqNum == CoefNum + N) return 0;
- if (EqNum == CoefNum - N) return 1;
- if (EqNum == CoefNum + 1) return 0;
- if (EqNum == CoefNum - 1) return 1;
- }
- int main(){
- EqNum = N*N*N;
- VectorXd u(EqNum), b(EqNum);
- SparseMatrix<double> A(EqNum,EqNum);
- for (int i = 0; i < EqNum; i++){
- b(i) = f(i / (N*N), i % (N*N) / N, i % N)*(2.0/(N+1))*(2.0/(N+1);
- }
- for (int i = 0; i < EqNum; i++){
- for (int j = 0; j < EqNum; j++){
- A(i,j) = CoefA(i,j);
- }
- BiCGSTAB<SparseMatrix<double> > solver;
- solver.compute(A);
- x = solver.solve(b);
- for (int i = 0; i < EqNum; i++) printf("%d %d %d %lf %lf %lf\n",i / (N*N),i % (N*N) / N, i % N,u[i], F(i / (N*N), i % (N*N) / N, i % N), fabs(u[i]-F(i / (N*N), i % (N*N) / N, i % N)));
- scanf("%d",&EqNum);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement