Тен (1194485), страница 6
Текст из файла (страница 6)
}
ff << endl;
}
cout << "Done!" << endl;
system("pause");
return 0;
}
//
/////////////////////////////////////////////////////////////
double getK11(double l, double h)
{
return (l*l + h*h);
};
double getK12(double l, double h)
{
return ((l*l) / 2.0 - h*h);
};
double getK13(double l, double h)
{
return (-1.0 / 2.0)*(l*l + h*h);
};
double getK14(double l, double h)
{
return ((h*h) / 2.0 - l*l);
};
// вычисление локальной матрицы жесткости
double** genKmatrix(double l, double h)
{
// множитель перед матрицей и коэфф. лямбда
double factor = 1.0 / (3 * l*h);
double** m = new double*[4];
for (int i = 0; i < 4; i++)
m[i] = new double[4];
for (int i = 0; i < 4; i++)
{
m[i][i] = getK11(l, h)*factor;
}
for (int i = 0; i < 4; i++)
{
m[i][3 - i] = getK14(l, h)*factor;
}
m[0][1] = getK12(l, h)*factor;
m[1][0] = m[0][1];
m[2][3] = m[0][1];
m[3][2] = m[0][1];
m[0][2] = getK13(l, h)*factor;
m[1][3] = m[0][2];
m[2][0] = m[0][2];
m[3][1] = m[0][2];
return m;
}
//транспонирование матрицы m x n в матрицу n x m
double** T(double** mtrx, int m, int n)
{
double** Tmtrx = new double*[n];
for (int i = 0; i < n; i++)
Tmtrx[i] = new double[m];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
{
Tmtrx[j][i] = mtrx[i][j];
}
return Tmtrx;
}
int** T(int** mtrx, int m, int n)
{
int** Tmtrx = new int*[n];
for (int i = 0; i < n; i++)
Tmtrx[i] = new int[m];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
{
Tmtrx[j][i] = mtrx[i][j];
}
return Tmtrx;
}
//вывод квадратной матрицы m x m
void show_mtrx(double** mtrx, int m)
{
cout << "matrix is " << endl;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
cout << std::setw(10) << mtrx[i][j] << std::setw(10);
cout << endl;
}
}
//вывод матрицы m x n
void show_mtrx(double** mtrx, int m, int n)
{
cout << "matrix is " << endl;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
cout << std::setw(10) << mtrx[i][j] << std::setw(5);
cout << endl;
}
}
void show_mtrx(int** mtrx, int m, int n)
{
cout << "matrix is " << endl;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
cout << std::setw(2) << mtrx[i][j] << std::setw(2);
cout << endl;
}
}
//умножение матриц m x n - n x q
double** prod(double** a, double** b, int m, int n, int q)
{
double** c = new double*[m];
for (int i = 0; i < m; i++)
c[i] = new double[q];
for (int i = 0; i < m; i++)
for (int j = 0; j < q; j++)
c[i][j] = 0;
double tmp = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < q; j++)
{
for (int k = 0; k < n; k++)
c[i][j] += a[i][k] * b[k][j];
}
return c;
}
double** prod(int** a, double** b, int m, int n, int q)
{
double** c = new double*[m];
for (int i = 0; i < m; i++)
c[i] = new double[q];
for (int i = 0; i < m; i++)
for (int j = 0; j < q; j++)
c[i][j] = 0;
double tmp = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < q; j++)
{
for (int k = 0; k < n; k++)
c[i][j] += a[i][k] * b[k][j];
}
return c;
}
double** prod(double** a, int** b, int m, int n, int q)
{
double** c = new double*[m];
for (int i = 0; i < m; i++)
c[i] = new double[q];
for (int i = 0; i < m; i++)
for (int j = 0; j < q; j++)
c[i][j] = 0;
double tmp = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < q; j++)
{
for (int k = 0; k < n; k++)
c[i][j] += a[i][k] * b[k][j];
}
return c;
}
double** genMatrix(int m, int n) {
double** c = new double*[m];
for (int i = 0; i < m; i++)
c[i] = new double[n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
c[i][j] = 0 + rand() % 10;
return c;
}
double** genMatrixD(int m, int n) {
double** c = new double*[m];
for (int i = 0; i < m; i++)
c[i] = new double[n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
{
if (i == j) c[i][j] = 100; else
{
c[i][j] = 0 + rand() % 10;
}
}
return c;
}
double** genMatrixZ(int m, int n) {
double** c = new double*[m];
for (int i = 0; i < m; i++)
c[i] = new double[n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
c[i][j] = 0;
return c;
}
double** sumMatrix(double**a, double **b, int m, int n)
{
double** c = new double*[m];
for (int i = 0; i < m; i++)
c[i] = new double[n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
c[i][j] = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
c[i][j] = a[i][j] + b[i][j];
return c;
}
int** genOmega(int N, int v1, int v2, int v3, int v4) {
int t = (N + 1)*(N + 1);
int** o = new int*[4];
for (int i = 0; i < 4; i++)
o[i] = new int[t];
for (int i = 0; i < 4; i++)
for (int j = 0; j < t; j++)
o[i][j] = 0;
o[0][v3 - 1] = 1;
o[1][v4 - 1] = 1;
o[2][v2 - 1] = 1;
o[3][v1 - 1] = 1;
return o;
}
double** genRK(double sigma, double f, double H, double* ppp) {
double** rk = new double*[4];
for (int i = 0; i < 4; i++)
rk[i] = new double[1];
rk[0][0] = f * (H*H) / 4.0;
rk[1][0] = f * (H*H) / 4.0;
rk[2][0] = f * (H*H) / 4.0;
rk[3][0] = f * (H*H) / 4.0;
return rk;
}
double f(double x, double y)
{
//double ff = x + y;
return 5;
}
//процедура Пейна - Айронса для гран. условий Дирихле (Нори Фриз стр 32.)
void payne_irons(double ** gK, double * r, int N, double g0, double g1, double sigma)
{
//сбор узлов для Дирихле
Pp* dirihle = new Pp[(N + 1)*4 - 4];
int cnt = 0;
int k = 0;
for (int i = 0; i < N + 1; i++) {
for (int j = 0; j < N + 1; j++)
{
if (j == 0 || j == (N) || i == 0 || i == (N))
{
double x = i*h_;
double y = j*h_;
Pp p = { cnt, x, y };
dirihle[k] = p;
k++;
}
//goo2 << "(" << i << " , " << j << ")[" << cnt << "] " << side << " ";
cnt++;
}
}
double big = 99999999999099.00;
int jj = 0;
int t = (N + 1)*(N + 1);
for (int i = 0; i < k; i++)
{
jj = dirihle[i].count;
double fff = sin(dirihle[i].x ) + sin(dirihle[i].y);
//double fff = 0;
r[jj] = big*fff*gK[jj][jj];
gK[jj][jj] = gK[jj][jj] * big;
//r[jj] = fff;
//gK[jj][jj] = 1.0;
//for (int i = 0; i < t; i++)
//{
// if(i != jj)
// gK[jj][i] = 0.0;
//}
}
}
bool converge(double *xk, double *xkp, int n)
{
double norm = 0;
for (int i = 0; i < n; i++)
{
norm += (xk[i] - xkp[i])*(xk[i] - xkp[i]);
}
if (sqrt(norm) >= eps)
return false;
return true;
}
double* seidel(int size, double **a, double* b) {
int n = size;
double* x = new double[size];
double* p = new double[size];
for (int i = 0; i < size; i++)
{
x[i] = 0;
p[i] = 0;
}
//
do
{
//cout << "hello from seidel iteration " << endl;
for (int i = 0; i < n; i++)
p[i] = x[i];
for (int i = 0; i < n; i++)
{
double var = 0;
for (int j = 0; j < i; j++)
var += (a[i][j] * x[j]);
for (int j = i + 1; j < n; j++)
var += (a[i][j] * p[j]);
x[i] = (b[i] - var) / a[i][i];
}
} while (!converge(x, p, size));
return x;
}
double* genVector(int n)
{
double * v = new double[n];
for (int i = 0; i < n; i++)
v[i] = 1;
return v;
}
void show_vec(double* v, int n) {
cout << "vector: " << endl;
for (int i = 0; i < n; i++)
cout << v[i] << endl;
}
void show_vec(int* v, int n) {
cout << "vector: " << endl;
for (int i = 0; i < n; i++)
cout << v[i] << endl;
}















