Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

KM2016 / Discret_rod / fem1

.pdf
Скачиваний:
11
Добавлен:
14.03.2016
Размер:
33.49 Кб
Скачать

//Содержание файла «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

*/

 

 

Соседние файлы в папке Discret_rod
  • #
    14.03.20164.68 Кб8fem1.cpp
  • #
    14.03.20164.68 Кб7fem1.cpp~
  • #
    14.03.2016403 б7fem1.h
  • #
    14.03.201633.49 Кб11fem1.pdf
  • #
    14.03.20164.67 Кб7fem2.cpp~
  • #
    14.03.2016405 б7fem2.h~
  • #
    14.03.201667 б7multybar.dat
  • #
    14.03.2016216 б7results.dat