Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:KM2016 / Приложение к разделу 2 Составной стержень / fem2
.cpp//Содержание файла «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
*/