简体   繁体   English

符号矩阵和numpy使用错误“ TypeError:输入类型不支持ufunc'isfinite'。”

[英]Symbolic matrix and numpy usage error “TypeError: ufunc 'isfinite' not supported for the input types..”

I was trying to perform a scipy.opimization using minimize function. 我试图使用最小化功能执行scipy.opimization。 I am looking to find all the variables like Iz,Iy,J,kz,ky,Yc,Yg such that the error between vector K_P_X and f is minimum. 我正在寻找所有像Iz,Iy,J,kz,ky,Yc,Yg这样的变量,以使向量K_P_X和f之间的误差最小。 That is objective function K_P_X-f should be minimum. 也就是说, objective function K_P_X-f应该最小。 I think my mistake is related to the calculation involving numpy.linalg.norm(sol-f) where the sol is assigned with a symbolic vector (K_P_X). 我认为我的错误与涉及numpy.linalg.norm(sol-f)的计算有关,其中sol被分配了符号向量(K_P_X)。 Due to the data type conflict i am getting this error. 由于数据类型冲突,我收到此错误。 If that's the case, Q1. 如果是这样,请问Q1。 Can anyone please suggest a better way to represent the equality constraint equation (ie. constr1()) such that this error can be avoided. 任何人都可以提出一种更好的方法来表示等式约束方程式(即constr1()),从而避免出现此错误。 The full code is given below, 完整的代码如下

import scipy.optimize as optimize
from sympy import symbols,zeros,Matrix,Transpose
import numpy


#Symobolic K matrix
Zc,Yc,Zg,Yg=symbols("Zc Yc Zg Yg",real=True)
A,Iz,Iy,J,kz,ky,E,G,L=symbols("A Iz Iy J kz ky E G L",real=True,positive=True)
E=10400000;G=3909800;L=5

def phi_z():
    phi_z=(12*E*Iy)/(kz*A*G*L**2)
    return phi_z
def phi_y():
    phi_y=(12*E*Iz)/(ky*A*G*L**2)
    return phi_y

K_P=zeros(12,12)
K1=Matrix(([E*A/L,0,0],[0,(12*E*Iz)/((1+phi_y())*L**3),0],[0,0,(12*E*Iy)/((1+phi_z())*L**3)]))
K2=Matrix(([G*J/L,0,0],[0,E*Iy/L,0],[0,0,E*Iz/L]))
Q1=Matrix(([0,Zg,-Yg],[-Zc,0,L/2],[Yc,-L/2,0]))
Q1_T=Transpose(Q1)
Q2=Matrix(([0,Zg,-Yg],[-Zc,0,-L/2],[Yc,L/2,0]))
Q2_T=Transpose(Q2)
K11=K1; K12=K1*Q1; K13=-K1; K14=-K1*Q2; K22=Q1_T*K1*Q1+K2; K23=-Q1_T*K1; K24=-Q1_T*K1*Q2-K2; K33=K1; K34=K1*Q2; K44=Q2_T*K1*Q2+K2

K_P[0:3,0:3]=K11; K_P[0:3,3:6]=K12; K_P[0:3,6:9]=K13; K_P[0:3,9:12]=K14; K_P[3:6,3:6]=K22; K_P[3:6,6:9]=K23; K_P[3:6,9:12]=K24 ;K_P[6:9,6:9]=K33; K_P[6:9,9:12]=K34; K_P[9:12,9:12]=K44

##Converting Upper triangular stiffness matrix to Symmetric stiffness matrix##           
for i in range(0,12):           
    for j in range(0,12):
        K_P[j,i]=K_P[i,j]

K_P = K_P.subs({A: 7.55})
K_P = K_P.subs({Zc: 0})
K_P = K_P.subs({Zg: 0})

X= numpy.matrix([[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1]])
K_P_X=K_P*X
f= numpy.matrix([[-9346.76033789],[1595512.77906],[-1596283.83112],[274222.872543],[4234010.18889],[4255484.3549],[9346.76033789],[-1595512.77906],[1596283.83112],[-275173.513088],[3747408.91068],[3722085.0499]])
function=K_P_X-f

def Obj_func(variables):
    Iz,Iy,J,kz,ky,Yc,Yg=variables
    function=K_P_X-f #K_P_X matrix contains the variables like Iz,Iy,J,kz,ky,Yc,Yg.
    return function

def constr1(variables):
    sol = K_P_X     #Here the variables are in the symbolic vector K_P_X
    if numpy.allclose(sol, f):
        return 0.00 #If Error is equal to zero hence required accuracy is reached. So stop optimization
    else:
        return numpy.linalg.norm(sol-f)

initial_guess=[10,10,10,0.1,0.1,0.001,0.001]
cons = ({'type':'eq', 'fun': constr1},{'type': 'ineq', 'fun': lambda variables: -variables[3]+1},{'type': 'ineq', 'fun': lambda variables: variables[3]-0.001},{'type': 'ineq', 'fun': lambda variables: -variables[4]+1},{'type': 'ineq', 'fun': lambda variables: variables[4]-0.001},{'type': 'ineq', 'fun': lambda variables: -variables[5]+0.5},{'type': 'ineq', 'fun': lambda variables: variables[5]-0},{'type': 'ineq', 'fun': lambda variables: -variables[6]+0.5},{'type': 'ineq', 'fun': lambda variables: variables[6]-0})
bnds = ((1, 60), (1, 60),(1, 60),(0.1, 1),(0.1, 1),(0.001, 0.5),(0.001, 0.5))
res=optimize.minimize(Obj_func,initial_guess, bounds=bnds,constraints=cons)

I'll list some of the things that are wrong here. 我会在这里列出一些错误的地方。

  • As hpaulj said, you can't directly pass SymPy objects to SciPy or NumPy. 正如hpaulj所说,您不能直接将SymPy对象传递给SciPy或NumPy。 But you can lambdify and then use that in the minimization routine 但是您可以进行lambdify ,然后在最小化例程中使用它
  • Your minimization setup does not make sense. 您的最小化设置没有意义。 Minimizing a function with the constraint that that same function must be zero... this is not what constrained minimization means. 最小化一个函数的约束是该函数必须为零...这不是约束最小化的含义。 Constraints are something different from the objective. 约束与目标有所不同。
  • It's better to use least_squares here which is dedicated to minimizing the norm of the difference (some vector function - target vector). 最好在这里使用least_squares ,它专门用于最小化差异的范数(某些矢量函数-目标矢量)。

With that in mind, here is your script reworked: 考虑到这一点,下面是修改后的脚本:

import scipy.optimize as optimize
from sympy import symbols, Matrix, lambdify
import numpy

Iz,Iy,J,kz,ky,Yc,Yg = symbols("Iz Iy J kz ky Yc Yg",real=True,positive=True)
K_P_X = Matrix([[37.7776503296448*Yg + 8.23411191827681],[-340.454138522391*Iz/(21.1513673253807*Iz/ky + 125)],[-9.4135635827062*Iy*Yc/(21.1513673253807*Iy/kz + 125) - 368.454956983948*Iy/(21.1513673253807*Iy/kz + 125)],[-9.4135635827062*Iy*Yc**2/(21.1513673253807*Iy/kz + 125) - 368.454956983948*Iy*Yc/(21.1513673253807*Iy/kz + 125) - 0.0589826136148473*J],[23.5339089567655*Iy*Yc/(21.1513673253807*Iy/kz + 125) + 2.62756822555969*Iy + 921.137392459871*Iy/(21.1513673253807*Iy/kz + 125)],[-5.00660515891599*Iz - 851.135346305977*Iz/(21.1513673253807*Iz/ky + 125) - 37.7776503296448*Yg**2 - 8.23411191827681*Yg],[-37.7776503296448*Yg - 8.23411191827681],[340.454138522391*Iz/(21.1513673253807*Iz/ky + 125)],[9.4135635827062*Iy*Yc/(21.1513673253807*Iy/kz + 125) + 368.454956983948*Iy/(21.1513673253807*Iy/kz + 125)],[9.4135635827062*Iy*Yc**2/(21.1513673253807*Iy/kz + 125) + 368.454956983948*Iy*Yc/(21.1513673253807*Iy/kz + 125) + 0.0589826136148473*J],[23.5339089567655*Iy*Yc/(21.1513673253807*Iy/kz + 125) - 2.62756822555969*Iy + 921.137392459871*Iy/(21.1513673253807*Iy/kz + 125)],[5.00660515891599*Iz - 851.135346305977*Iz/(21.1513673253807*Iz/ky + 125) + 37.7776503296448*Yg**2 + 8.23411191827681*Yg]])
f = Matrix([[-1],[-1],[-1],[-1.00059553353],[3.99999996539],[-5.99940443072],[1],[1],[1],[1],[1],[1]])
obj = lambdify([Iz,Iy,J,kz,ky,Yc,Yg], tuple(K_P_X - f))
initial_guess=[10,10,10,0.1,0.1,0.001,0.001]
bnds = ((1, 60), (1, 60),(1, 60),(0.1, 1),(0.1, 1),(0.001, 0.5),(0.001, 0.5))
lower = [a for (a, b) in bnds]
upper = [b for (a, b) in bnds]
res = optimize.least_squares(lambda x: obj(x[0], x[1], x[2], x[3], x[4], x[5], x[6]), initial_guess, bounds=(lower, upper))
print(res)

Changes: 变化:

  • Prior to lambdify , we should have a SymPy expression. lambdify之前,我们应该有一个SymPy表达式。 So both K_P_X and f are SymPy matrices now. 因此, K_P_Xf现在都是SymPy矩阵。
  • Lambdified function takes 7 scalar arguments and returns a tuple of components of K_P_X - f Lambdified函数采用7个标量参数,并返回K_P_X - f的元组K_P_X - f
  • The bounds are separated into lower and upper, as the syntax of least_squares requires 边界被分为上下两部分,如least_squares的语法要求
  • We can't directly pass obj to least_squares , because it will receive one array parameter instead of 7 scalars. 我们无法将obj直接传递给least_squares ,因为它将接收一个数组参数而不是7个标量。 Hence the additional lambda step for unpacking the vector. 因此,用于解压缩向量的附加lambda步骤。

Believe it or not, minimization works. 信不信由你,最小化的工作。 It returns res.x , the minimum point, as 它返回最小点res.x作为

  [  1.00000000e+00,   1.00000000e+00,   1.69406332e+01,
     1.00000000e-01,   1.00000000e-01,   1.00000000e-03,
     1.00000000e-03]

which looks suspiciously round at first, but this is only because the point hits against the bounds you placed (10, 1, 0.1 and so on). 一开始看起来很可疑,但这仅仅是因为该点碰到了您放置的边界(10、1、0.1等)。 Only the third variable ended up with an inactive constaint. 只有第三个变量以无效约束结束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Python Numpy 类型错误:输入类型不支持 ufunc 'isfinite' - Python Numpy TypeError: ufunc 'isfinite' not supported for the input types Python Numpy 类型错误:输入类型不支持 ufunc 'isfinite' - Python Numpy Type Error: ufunc 'isfinite' not supported for the input types TypeError:输入类型不支持 ufunc 'isfinite' - TypeError: ufunc 'isfinite' not supported for the input types Stackplot “TypeError:输入类型不支持 ufunc 'isfinite'” - Stackplot “TypeError: ufunc 'isfinite' not supported for the input types” statsmodels 引发 TypeError:优化输入中的输入类型不支持 ufunc 'isfinite' - statsmodels raises TypeError: ufunc 'isfinite' not supported for the input types in Optimising Input statsmodels 引发 TypeError:输入类型不支持 ufunc 'isfinite' - statsmodels raises TypeError: ufunc 'isfinite' not supported for the input types MatPlotLib、日期时间和类型错误:输入类型不支持 ufunc 'isfinite'... - MatPlotLib, datetimes, and TypeError: ufunc 'isfinite' not supported for the input types… Seaborn 线图,TypeError:输入类型不支持 ufunc 'isfinite' - Seaborn lineplot, TypeError: ufunc 'isfinite' not supported for the input types Perfplot bench() 引发“类型错误:输入类型和输入类型不支持 ufunc 'isfinite'” - Perfplot bench() raises "TypeError: ufunc 'isfinite' not supported for the input types, and the input types" W&B Keras 回调类型错误:输入类型不支持 ufunc 'isfinite' - W&B Keras callback TypeError: ufunc 'isfinite' not supported for the input types
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM