# Apply constraints (penalty Method) penalty = np.max(np.abs(KKG)) * 1e4 for i in range(nconstrain): # Check for valid constraint degrees of freedom if constrain[i, 1] < 0or constrain[i, 1] > 2: raise ValueError("Constraint degrees of freedom must be within the range 1-3 (adjusted to 0-2 after indexing).") m = int((constrain[i, 0] - 1) * Dof + int(constrain[i, 1])) KKG[m, m] = KKG[m, m] + penalty FFG[m] = FFG[m] + penalty * constrain[i, 2]
# Solve for the nodal displacements KKG = csr_matrix(KKG) # Convert the stiffness matrix to CSR format for efficient solving UUG = spsolve(KKG, FFG) # Solve the linear system KKG * UUG = FFG
# Solve for the nodal RF for i in range(nconstrain): m = int((constrain[i, 0] - 1) * Dof + int(constrain[i, 1])) RFG[m] = penalty * (constrain[i, 2] - UUG[m])
Matlab
penalty = max(abs(KKG(:))) * 1e4;
fori = 1:nconstrain m = (obj.Constrain(i,1) - 1) * Dof + obj.Constrain(i,2); KKG(m, m) = KKG(m, m) + penalty; FFG(m) = FFG(m) + penalty * obj.Constrain(i,3); end
U = KKG \ FFG;
fori = 1:nconstrain m = (obj.Constrain(i,1) - 1) * Dof + obj.Constrain(i,2); RF(m) = penalty * (obj.Constrain(i,3) - U(m)); end