KM2016 / Discret_rod / fem1
.pdf//Содержание файла «fem2.h» /*
#include <ctype.h> #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h>
int bars_N, knots_N, DSign;
double *force, *strengs, *length, *f, *solution; double *up, *down, *diag;
double K_M[100][100],L[100][100], U[100][100]; double VV[100];
int Indx[100];
int inputdata(void); int output(void); void K_matrix(void);
void progon(int ,double *,double *,double *,double *); */
//Содержание файла «fem2.cpp»
#include "fem2.h"
int main(int argc,char *argv[]) { if(inputdata() == 0 ) return 0; solution = new double[knots_N];
K_matrix(); //построение матрицы жёсткости системы К (формула (15)) progon(knots_N, down, diag, up, f); // решение матричного уравнения методом прогонки output();
return 1;
}
//Вычисление матричных элементов по формуле (15) void K_matrix(void) {
for (int i=0;i<knots_N;i++) { for (int j=0;j<knots_N;j++) { if (i==j) {
K[i][i] = strengs[i]+strengs[i+1];
}
else if ((i-j)==1 ){ K[i][j] = -strengs[i];
}
else if ((i-j)==-1){ K[i][j] = -strengs[j];
}
else { K[i][j] = 0;
}
}
}
down = new double[knots_N]; diag = new double[knots_N]; up = new double[knots_N];
for (int i=0; i < knots_N; i++) {
for (int j=0; j < knots_N;j++) { |
|
if (i==j) { diag[i] = K[i][i]; } |
|
if ((i-j)==1) |
{ down[i] = K[i][j]; } |
if ((i-j)==-1) |
{ up[i] = K[i][j]; } |
} |
|
}
}
// считывание исходных данных из файла int inputdata(void) {
FILE *in;
if ((in = fopen("multybar.dat", "rt")) == NULL) { fprintf(stderr, "? multybar.dat file ? \n");
return 0;
}
fscanf(in,"%d\n",&bars_N); // число элементов knots_N = bars_N-1; // число узлов
double *c;
force = new double[knots_N];// силы в узлах f = new double[knots_N];
strengs = new double[bars_N];// жесткость элемента на единицу длины length = new double[bars_N];// длина элемента стержня
c = new double[bars_N];//жесткость элемента стержня for(int i = 0;i < knots_N ; i++) { fscanf(in,"%lg\n",&force[i]);
f[i] = force[i];
}
for(int i= 0;i < bars_N; i++) { fscanf(in,"%lg %lg\n",&length[i],&c[i]); //жесткость элемента на единицу длины strengs[i] = c[i]/length[i];
}
fclose(in); return 1;
}
//вывод результата int output(void) { FILE *out;
out = fopen("results.dat", "wt");
double x; |
|
fprintf(out,"\n x, m |
force, N u, m\n"); |
for (int i=0;i<knots_N;i++) { x = x + length[i];
fprintf(out,"%-12.3g%-12.3g%-12.3g\n", x, force[i], solution[i]);
}
fclose(out); return 1;
}
void progon(int n,double c[],double a[],double b[],double g[])
//Решение линейной трёхдиагональной матрицы методом прогонки
//int n - порядок марицы
//double c[] - входной вектор длины n - диагональные матричные элементы под главной диагональю
//c[0] не используется
//double a[] - входной вектор длины n - диагональные матричные элементы в главной диагонали
//разрушается в процессе вычислений
//double b[] - входной вектор длины n - диагональные матричные элементы над главной диагональю,
//b[n-1] не используется
//double g[ - входной вектор длины n - правая часть матричного уравнения,
//при вычислении разрушается и заменяется решением
{
int j,i; double r;
for(i=1;i<n;i++) { j=i-1; r=c[i]/a[j]; a[i]-=r*b[j]; g[i]-=r*g[j];
}
j=n-1; g[j]/=a[j];
for(i=n-2 ; i>=0; i--){ g[i]=(g[i]-b[i]*g[i+1])/a[i];
}
solution = g;
}
/*
//файл входных данных "mutybar.dat"
6
10
20
30
40
50
0.1 1e4
0.2 2e4
0.3 3e4
0.4 4e4
0.5 5e4
0.6 6e4
//Файл результатов вычислений
x, m |
force, N u, m |
|
0.1 |
10 |
0.000583 |
0.3 |
20 |
0.00107 |
0.6 |
30 |
0.00135 |
1 |
40 |
0.00133 |
1.5 |
50 |
0.000917 |
*/ |
|
|