Граничные условия делятся на естественные и главные. В качестве естественных граничных условий выступают внешние силы, которые входят в правую часть уравнений равновесия. Для формирования вектора нагрузки организуем цикл с обходом узлов рамы в координатной матрице и добавим в его ячейки силы из четвертого, пятого и шестого столбцов таблицы в соответствии с номерами обобщенных перемещений. Кроме того в столбец обобщенных сил необходимо добавить вклад от распределенных сил, указанных в топологической матрице для каждого элемента, приведенный по выражению (4.8) к глобальным осям координат.
Главные граничные условия – это условия закрепления конструкции. При наложении условий закрепления, то есть уменьшении количества степеней свободы системы, уравнения не вычеркивают, а заменяют фиктивными для сохранения нумерации в матрицах. Один из способов состоит в обнулении всех элементов строки, кроме диагонального для данного элемента и обнуление соответствующего элемента столбца нагрузки.
|
|
Если перемещения в закрепленных узлах не равны нулю, то их действительные значения, умноженные на диагональный элемент матрицы жесткости, помещают в соответствующую строку вектора нагрузки.
Когда в матрице узлов в столбцах 7,8,9 стоят (-1) – это означает закрепление данного узла по соответствующему направлению: x,y,φ.
for (int i = 0; i < f1.n; i++)
{
//Наложение главных граничных условий для неподвижных опор
if (Convert.ToInt32(f1.MatrCoor[i, 6]) < 0)
{
for (int j = 0; j < f1.n * 3; j++)
{
K1[3 * i, j] = 0;
}
K1[3 * i, 3 * i] = K[3 * i, 3 * i];
P[3 * i] = 0;
}
if (Convert.ToInt32(f1.MatrCoor[i, 7]) < 0)
{
for (int j = 0; j < f1.n * 3; j++)
{
K1[3 * i + 1, j] = 0;
}
K1[3 * i + 1, 3 * i + 1] = K[3 * i + 1, 3 * i + 1];
P[3 * i + 1] = 0;
}
if (Convert.ToInt32(f1.MatrCoor[i, 8]) < 0)
{
for (int j = 0; j < f1.n * 3; j++)
{
K1[3 * i + 2, j] = 0;
}
K1[3 * i + 2, 3 * i + 2] = K[3 * i + 2, 3 * i + 2];
P[3 * i + 2] = 0;
}
}
Случай, когда в столбцах 7,8,9 стоят нули, означает отсутствие закрепления.
Если в ячейках этих столбцов стоят положительные целые числа, то это означает, что данное перемещение равно перемещению узла по соответствующему направлению, с номером, указанным в ячейке.
Такое явление возникает при наличии в системе внутренних шарниров, муфт и других видов связей. При этом внешние силы, приложенные в шарнире во всех узлах, прикладывают к одному из узлов, примыкающему к шарниру. Коэффициенты, стоящие вне главной диагонали в матрицы жесткости для других узлов примыкающих к шарниру обнуляются, а на место элемента, соответствующего первому узлу, помещается Диагональный коэффициент этой же строки матрицы приравнивается единице , так, что для обусловленных перемещений уравнения принимают вид
,
где - перемещение второго (третьего и т. д.) узла в шарнире, - перемещение первого узла в шарнире, уравнение которого не обнулялось и к которому отнесены все узловые силы, приложенные в шарнире по данному направлению:
|
|
for (int i = 0; i < f1.n; i++)
{
//Наложение главных граничных условий для подвижных соединений
if (Convert.ToInt32(f1.MatrCoor[i, 6]) > 0)
{
int sh = Convert.ToInt32(f1.MatrCoor[i, 6]) - 1;
for (int j = 0; j < f1.n * 3; j++)
{
K1[3 * sh, j] = K1[3 * sh, j] + K1[3 * i, j];
K1[3 * i, j] = 0;
}
P[3 * sh] = P[3 * i] + P[3 * sh];
P[3 * i] = 0;
K1[3 * i, 3 * sh] = -1.0;
K1[3 * i, 3 * i] = 1.0;
}
if (Convert.ToInt32(f1.MatrCoor[i, 7]) > 0)
{
int sh = Convert.ToInt32(f1.MatrCoor[i, 7]) - 1;
for (int j = 0; j < f1.n * 3; j++)
{
K1[3 * sh + 1, j] = K1[3 * sh + 1, j] + K1[3 * i + 1, j];
K1[3 * i + 1, j] = 0;
}
P[3 * sh + 1] = P[3 * i + 1] + P[3 * sh + 1];
P[3 * i + 1] = 0;
K1[3 * i + 1, 3 * sh + 1] = -1.0;
K1[3 * i + 1, 3 * i + 1] = 1.0;
}
if (Convert.ToInt32(f1.MatrCoor[i, 8]) > 0)
{
int sh = Convert.ToInt32(f1.MatrCoor[i, 8]) - 1;
for (int j = 0; j < f1.n * 3; j++)
{
K1[3 * sh + 2, j] = K1[3 * sh + 2, j] + K1[3 * i + 2, j];
K1[3 * i + 2, j] = 0;
}
P[3 * sh + 2] = P[3 * i + 2] + P[3 * sh + 2];
P[3 * i + 2] = 0;
K1[3 * i + 2, 3 * sh + 2] = -1.0;
K1[3 * i + 2, 3 * i + 2] = 1.0;
}
}