2017-11-08 1 views
0

저는 sympy를 사용하여 16 개의 방정식과 16 개의 미지수로 방정식 시스템을 풀려고하고 있지만 잘 풀리지 않는 것 같습니다.sympy solve()는 암시 적/부정확 한 답을줍니다.

[K] [d] = [f] 여기서 [K]는 계수 행렬이고 [d] 미지수와 [f]는 상수입니다. 나는 어떤 미지수 "d"와 어떤 상수 "f"를 알고 있기 때문에 방정식과 미지수에 대해 같은 수를 가지고 있습니다. 그러나이 값을 방정식으로 대체하고 그것을 풀려고하면 "dx"의 결과는 "dx8"을 포함합니다. . 행렬식을 확인하고 긍정적 인 결과를 얻을 수 있도록 고유 한 답을 얻어야합니다. 여기

코드입니다 :

import sympy as sp 
import numpy as np 

K = np.array([[560000000.0, 0.0, -480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0,-80000000.0, 120000000.0, 0.0, -200000000.0, 0.0, 0.0, 0.0, 0.0], 
    [0.0, 393333333.3, 120000000.0, -180000000.0, 0.0, 0.0, 0.0, 0.0,80000000.0, -213333333.3, -200000000.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
    [-480000000.0, 120000000.0, 1120000000.0, -200000000.0,-480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, -160000000.0,200000000.0, 0.0, -200000000.0, 0.0, 0.0], 
    [80000000.0, -180000000.0, -200000000.0, 786666666.7, 120000000.0,-180000000.0, 0.0, 0.0, 0.0, 0.0, 200000000.0, -426666666.7,-200000000.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, -480000000.0, 120000000.0, 1120000000.0, -200000000.0,-480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, -160000000.0,200000000.0, 0.0, -200000000.0], 
    [0.0, 0.0, 80000000.0, -180000000.0, -200000000.0, 786666666.7,120000000.0, -180000000.0, 0.0, 0.0, 0.0, 0.0, 200000000.0,-426666666.7, -200000000.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, -480000000.0, 120000000.0, 560000000.0,-200000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -80000000.0, 80000000.0], 
    [0.0, 0.0, 0.0, 0.0, 80000000.0, -180000000.0, -200000000.0,393333333.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 120000000.0,-213333333.3], 
    [-80000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 560000000.0,-200000000.0, -480000000.0, 120000000.0, 0.0, 0.0, 0.0, 0.0], 
    [120000000.0, -213333333.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,-200000000.0, 393333333.3, 80000000.0, -180000000.0, 0.0, 0.0, 0.0,0.0], 
    [0.0, -200000000.0, -160000000.0, 200000000.0, 0.0, 0.0, 0.0, 0.0,-480000000.0, 80000000.0, 1120000000.0, -200000000.0, -480000000.0,120000000.0, 0.0, 0.0], 
    [-200000000.0, 0.0, 200000000.0, -426666666.7, 0.0, 0.0, 0.0, 0.0,120000000.0, -180000000.0, -200000000.0, 786666666.7, 80000000.0,-180000000.0, 0.0, 0.0], 
    [0.0, 0.0, 0.0, -200000000.0, -160000000.0, 200000000.0, 0.0, 0.0,0.0, 0.0, -480000000.0, 80000000.0, 1120000000.0, -200000000.0,-480000000.0, 120000000.0], 
    [0.0, 0.0, -200000000.0, 0.0, 200000000.0, -426666666.7, 0.0, 0.0,0.0, 0.0, 120000000.0, -180000000.0, -200000000.0, 786666666.7,80000000.0, -180000000.0], 
    [0.0, 0.0, 0.0, 0.0, 0.0, -200000000.0, -80000000.0, 120000000.0,0.0, 0.0, 0.0, 0.0, -480000000.0, 80000000.0, 560000000.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, -200000000.0, 0.0, 80000000.0, -213333333.3,0.0, 0.0, 0.0, 0.0, 120000000.0, -180000000.0, 0.0, 393333333.3]]) 



x = [sp.var('dx'+ str(i+1)) for i in range(8)] 
y = [sp.var('dy'+ str(i+1)) for i in range(8)] 
fx = [sp.var('fx'+ str(i+1)) for i in range(8)] 
fy = [sp.var('fy'+ str(i+1)) for i in range(8)] 

xy = list(sum(zip(x, y),())) 
fxy = list(sum(zip(fx, fy),())) 

M = sp.Matrix(K)*sp.Matrix(xy) 
Ec = [sp.Eq(M[i], fxy[i]) for i in range(16)] 

#known values 
d_kwn = [(dy1, 0), (dy2, 0), (dy3, 0), (dy4, 0)] 

f_kwn = [(fx5, 0), (fy5, 0), (fx6, 0), (fy6, -3000), (fx7, 0), (fy7, -3000),(fx8, 0), (fy8, 0), (fx1, 0), (fx2, 0), (fx3, 0), (fx4, 0)] 

for var in d_kwn: 
    for i, eq in enumerate(Ec): 
     Ec[i] = eq.subs(var[0], var[1]) 

for var in f_kwn: 
    for i, eq in enumerate(Ec): 
     Ec[i] = eq.subs(var[0], var[1]) 

Sols = sp.solvers.solve(Ec) 
sp.Matrix(sorted(Sols.items(), key=str)) 

그리고 이것은 내가 갖는 출력입니다 :

{dx1: dx8−3.54468009860439⋅10−6, 
dx2: dx8−1.8414987360977⋅10−6, 
dx3: dx8−2.11496606381994⋅10−7, 
dx4: dx8+2.05943267588118⋅10−7, 
dx5: dx8−1.24937663359153⋅10−6, 
dx6: dx8−1.55655946713284⋅10−6, 
dx7: dx8−1.08797652070783⋅10−6, 
dy5: −2.10639657360695⋅10−6, 
dy6: −6.26959460018537⋅10−6, 
dy7: −6.32191585665888⋅10−6, 
dy8: −2.7105825114088⋅10−6, 
fy1: 439.746516706791, 
fy2: 2640.65618690176, 
fy3: 2399.44807607611, 
fy4: 520.14922031534} 

내가 dx8에 대한 결과를받지 못했습니다 이유를 모르겠어요. 나는 이론적으로 dx1 = dx4, dx2 = dx3, dx5 = dx8, dx6 = dx7 등의 방정식을 더 추가하려고 시도했다. 그러나 그것은 나에게 빈 목록을 준다. 도움이 될 것입니다.

답변

1

. 먼저 미지의 d 값에 대해서만 방정식의 감소 된 시스템을 풀 수 있습니다. 그런 다음 모든 d 값을 알면 알 수없는 f 수식 번호 (아래 코드에서 구현되지 않음)에 대해서만 [K][d]=[f]을 수행하여 알 수없는 f 값을 계산할 수 있습니다.

import sympy as sp 
import numpy as np 

K = np.array([[560000000.0, 0.0, -480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0,-80000000.0, 120000000.0, 0.0, -200000000.0, 0.0, 0.0, 0.0, 0.0], 
    [0.0, 393333333.3, 120000000.0, -180000000.0, 0.0, 0.0, 0.0, 0.0,80000000.0, -213333333.3, -200000000.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
    [-480000000.0, 120000000.0, 1120000000.0, -200000000.0,-480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, -160000000.0,200000000.0, 0.0, -200000000.0, 0.0, 0.0], 
    [80000000.0, -180000000.0, -200000000.0, 786666666.7, 120000000.0,-180000000.0, 0.0, 0.0, 0.0, 0.0, 200000000.0, -426666666.7,-200000000.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, -480000000.0, 120000000.0, 1120000000.0, -200000000.0,-480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, -160000000.0,200000000.0, 0.0, -200000000.0], 
    [0.0, 0.0, 80000000.0, -180000000.0, -200000000.0, 786666666.7,120000000.0, -180000000.0, 0.0, 0.0, 0.0, 0.0, 200000000.0,-426666666.7, -200000000.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, -480000000.0, 120000000.0, 560000000.0,-200000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -80000000.0, 80000000.0], 
    [0.0, 0.0, 0.0, 0.0, 80000000.0, -180000000.0, -200000000.0,393333333.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 120000000.0,-213333333.3], 
    [-80000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 560000000.0,-200000000.0, -480000000.0, 120000000.0, 0.0, 0.0, 0.0, 0.0], 
    [120000000.0, -213333333.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,-200000000.0, 393333333.3, 80000000.0, -180000000.0, 0.0, 0.0, 0.0,0.0], 
    [0.0, -200000000.0, -160000000.0, 200000000.0, 0.0, 0.0, 0.0, 0.0,-480000000.0, 80000000.0, 1120000000.0, -200000000.0, -480000000.0,120000000.0, 0.0, 0.0], 
    [-200000000.0, 0.0, 200000000.0, -426666666.7, 0.0, 0.0, 0.0, 0.0,120000000.0, -180000000.0, -200000000.0, 786666666.7, 80000000.0,-180000000.0, 0.0, 0.0], 
    [0.0, 0.0, 0.0, -200000000.0, -160000000.0, 200000000.0, 0.0, 0.0,0.0, 0.0, -480000000.0, 80000000.0, 1120000000.0, -200000000.0,-480000000.0, 120000000.0], 
    [0.0, 0.0, -200000000.0, 0.0, 200000000.0, -426666666.7, 0.0, 0.0,0.0, 0.0, 120000000.0, -180000000.0, -200000000.0, 786666666.7,80000000.0, -180000000.0], 
    [0.0, 0.0, 0.0, 0.0, 0.0, -200000000.0, -80000000.0, 120000000.0,0.0, 0.0, 0.0, 0.0, -480000000.0, 80000000.0, 560000000.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, -200000000.0, 0.0, 80000000.0, -213333333.3,0.0, 0.0, 0.0, 0.0, 120000000.0, -180000000.0, 0.0, 393333333.3]]) 



x = [sp.var('dx'+ str(i+1)) for i in range(8)] 
y = [sp.var('dy'+ str(i+1)) for i in range(8)] 
fx = [sp.var('fx'+ str(i+1)) for i in range(8)] 
fy = [sp.var('fy'+ str(i+1)) for i in range(8)] 

xy = list(sum(zip(x, y),())) 
fxy = list(sum(zip(fx, fy),())) 

M = sp.Matrix(K)*sp.Matrix(xy) 
Ec = [sp.Eq(M[i], fxy[i]) for i in range(16)] 

#known values 
d_kwn = [(dy1, 0), (dy2, 0), (dy3, 0), (dy4, 0)] 

f_kwn = [(fx5, 0), (fy5, 0), (fx6, 0), (fy6, -3000), (fx7, 0), (fy7, -3000),(fx8, 0), (fy8, 0), (fx1, 0), (fx2, 0), (fx3, 0), (fx4, 0)] 

for var in d_kwn: 
    for i, eq in enumerate(Ec): 
     Ec[i] = eq.subs(var[0], var[1]) 

for var in f_kwn: 
    for i, eq in enumerate(Ec): 
     Ec[i] = eq.subs(var[0], var[1]) 

Ec_part = [] 
for i in [0,2,4,6,8,9,10,11,12,13,14,15]: 
    Ec_part.append(Ec[i]) 

unknwns = [*x, *y[4:8]] 

Sols = sp.linsolve(Ec_part,unknwns) 

Sols = next(iter(Sols)) 

#sp.Matrix(sorted(Sols.items(), key=str)) 
+0

사실 그것은 유한 요소 문제입니다. 나는 두 가지 해결책을 모두 시도하고 있으며 어느 것이 더 나아질지를 보게 될 것이다. 고마워요! – Jack

1

Numpy 자체에서 선형 방정식의 시스템을 푸는 것이 편리합니다. 해결하려는 시스템의 유형은 경계 조건이있는 유한 요소 해석에 나타납니다. Numpy 만 사용한다면 괜찮습니까? 그렇다면 다음 코드가 작업을 수행합니다. 우리는 이미 fd의 요소를 우리는 다음과 같은 식의 감소 된 세트를 해결하기 위해 NumPy와 배열 인덱싱을 사용할 수 알려진 알고 : 당신이 Sympy를 사용해야하는 경우, 그 다음이 작동

import numpy as np 

# The NxN Coefficients matrix 
K = np.array([[560000000.0, 0.0, -480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0,-80000000.0, 120000000.0, 0.0, -200000000.0, 0.0, 0.0, 0.0, 0.0], 
    [0.0, 393333333.3, 120000000.0, -180000000.0, 0.0, 0.0, 0.0, 0.0,80000000.0, -213333333.3, -200000000.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
    [-480000000.0, 120000000.0, 1120000000.0, -200000000.0,-480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, -160000000.0,200000000.0, 0.0, -200000000.0, 0.0, 0.0], 
    [80000000.0, -180000000.0, -200000000.0, 786666666.7, 120000000.0,-180000000.0, 0.0, 0.0, 0.0, 0.0, 200000000.0, -426666666.7,-200000000.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, -480000000.0, 120000000.0, 1120000000.0, -200000000.0,-480000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, -160000000.0,200000000.0, 0.0, -200000000.0], 
    [0.0, 0.0, 80000000.0, -180000000.0, -200000000.0, 786666666.7,120000000.0, -180000000.0, 0.0, 0.0, 0.0, 0.0, 200000000.0,-426666666.7, -200000000.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, -480000000.0, 120000000.0, 560000000.0,-200000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -80000000.0, 80000000.0], 
    [0.0, 0.0, 0.0, 0.0, 80000000.0, -180000000.0, -200000000.0,393333333.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 120000000.0,-213333333.3], 
    [-80000000.0, 80000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 560000000.0,-200000000.0, -480000000.0, 120000000.0, 0.0, 0.0, 0.0, 0.0], 
    [120000000.0, -213333333.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,-200000000.0, 393333333.3, 80000000.0, -180000000.0, 0.0, 0.0, 0.0,0.0], 
    [0.0, -200000000.0, -160000000.0, 200000000.0, 0.0, 0.0, 0.0, 0.0,-480000000.0, 80000000.0, 1120000000.0, -200000000.0, -480000000.0,120000000.0, 0.0, 0.0], 
    [-200000000.0, 0.0, 200000000.0, -426666666.7, 0.0, 0.0, 0.0, 0.0,120000000.0, -180000000.0, -200000000.0, 786666666.7, 80000000.0,-180000000.0, 0.0, 0.0], 
    [0.0, 0.0, 0.0, -200000000.0, -160000000.0, 200000000.0, 0.0, 0.0,0.0, 0.0, -480000000.0, 80000000.0, 1120000000.0, -200000000.0,-480000000.0, 120000000.0], 
    [0.0, 0.0, -200000000.0, 0.0, 200000000.0, -426666666.7, 0.0, 0.0,0.0, 0.0, 120000000.0, -180000000.0, -200000000.0, 786666666.7,80000000.0, -180000000.0], 
    [0.0, 0.0, 0.0, 0.0, 0.0, -200000000.0, -80000000.0, 120000000.0,0.0, 0.0, 0.0, 0.0, -480000000.0, 80000000.0, 560000000.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, -200000000.0, 0.0, 80000000.0, -213333333.3,0.0, 0.0, 0.0, 0.0, 120000000.0, -180000000.0, 0.0, 393333333.3]]) 

# A logical array for indexing 
N = K.shape[0] # The number of columns in K 
N_2 = int(N/2); 

# Prepare the 'f' 
fx = np.zeros(N_2); 
fy = np.zeros(N_2); 

fx[ [0,1,2,3,4,5,6,7] ] = np.array([0]*N_2) # Known values of fx 
fy[ [4,5,6,7] ] = np.array([0,-3000,-3000,0]) 

f = np.concatenate((fx,fy)) 

# Solve for the unknown equations only 
d = np.zeros(N) 
rows = np.array([0,1,2,3,4,5,6,7,12,13,14,15]) 
rows = rows[:, np.newaxis] 
columns = np.array([0,1,2,3,4,5,6,7,12,13,14,15]) 

d[ columns ] = np.linalg.solve(K[ rows, columns ], f[ columns ]) 

# Calculate unknown f values 
f[ [8,9,10,11] ] = K[ [8,9,10,11], [8,9,10,11] ]*d[[8,9,10,11]]