Python:numpy.linalg.linalg.linalgeror:奇异矩阵
我正在尝试使用scipy.integrate中的ode解算器来解微分方程组。我的问题是,当我的矩阵不应该是奇异的时候,我得到了“奇异矩阵”错误。主要问题是当我试图在下面的代码中找到矩阵B的逆矩阵时。在下面的代码中,B是3x3矩阵,A是3x1矩阵,U也是3x1矩阵! 我怎样才能解决这个问题Python:numpy.linalg.linalg.linalgeror:奇异矩阵,numpy,ode,differential-equations,Numpy,Ode,Differential Equations,我正在尝试使用scipy.integrate中的ode解算器来解微分方程组。我的问题是,当我的矩阵不应该是奇异的时候,我得到了“奇异矩阵”错误。主要问题是当我试图在下面的代码中找到矩阵B的逆矩阵时。在下面的代码中,B是3x3矩阵,A是3x1矩阵,U也是3x1矩阵! 我怎样才能解决这个问题 import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint import math import
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
import math
import parameter_projection as pp
from scipy.integrate import ode
import sympy as sm
c=10
k,k1,k2,k3=10,9,8,7
eta=2.5
gamma,gamma1,gamma2=2,3,10
a=[]
for i in range(30):
a.append(i)
a=np.array(a)
def aero(t,Y):
V,alpha,beta,p,q,r,phi,theta=Y[0],Y[1],Y[2],Y[3],Y[4],Y[5],Y[6],Y[7]
sg=np.cos(alpha)*np.cos(beta)*np.sin(theta)-np.sin(beta)*np.sin(phi)*np.cos(theta)-np.sin(alpha)*np.cos(beta)*np.cos(phi)*np.cos(theta)
smcg=np.cos(alpha)*np.sin(beta)*np.sin(theta)+np.cos(beta)*np.sin(phi)*np.cos(theta)-np.sin(alpha)*np.sin(beta)*np.cos(phi)*np.cos(theta)
cmcg=np.sin(theta)*np.sin(alpha)+np.cos(alpha)*np.cos(phi)*np.cos(theta)
#error
ev=V-np.sin(t)
ebeta=beta-np.sin(t)
etheta=theta-np.sin(t)
ethetad=q*np.cos(phi)-r*np.sin(phi)-np.cos(t)
sv,sbeta,stheta=ev,ebeta,etheta+ethetad
s=np.array([[sv],[sbeta],[stheta]])
A=np.array([[-a[1]*V**2*np.sin(beta)-a[2]*V**2*np.sin(beta)-a[4]*np.sin(gamma)-np.cos(t)],[p*np.sin(alpha)-r*np.cos(alpha)+a[16]*V+a[15]*smcg-np.cos(t)],[ethetad+np.cos(phi)*a[10]*p*r+np.cos(phi)*a[6]*(r**2-p**2)+np.cos(phi)*a[20]*V**2-np.cos(phi)*a[21]*sg+-q*np.sin(phi)*p-q*np.sin(phi)*q*np.sin(phi)*np.tan(theta)-q*np.sin(phi)*r*np.cos(phi)*np.tan(theta)-np.sin(phi)*a[11]*p*q+a[12]*q*r-a[13]*V**2+r*np.cos(phi)*p+r*q*np.cos(phi)*np.sin(phi)*np.tan(theta)+(r*np.cos(phi))**2*np.tan(theta)-np.cos(t)]])
B=np.array([[a[0]*np.cos(alpha)*np.sin(beta),a[7]*np.sin(beta),a[0]*np.sin(alpha)*np.cos(beta)],[-a[9]*np.cos(alpha)*np.sin(beta)/V,a[22]*np.cos(beta)/V,-a[9]*np.sin(alpha)*np.sin(beta)/V],[a[29]*np.cos(phi),a[26]*np.sin(alpha)*np.sin(beta)*np.cos(phi)-a[27]*np.sin(phi)*np.cos(alpha),-a[25]*np.cos(phi)]])
C=np.linalg.inv(B)*A
U=(C-np.linalg.inv(B)*k*s-np.linalg.inv(B)*eta*np.tanh(s))
Vdot=a[0]*np.cos(alpha)*np.sin(beta)*U[0]-a[1]*V**2*np.cos(beta)-a[2]*V**2*np.sin(beta)-a[3]*sg+a[7]*np.sin(beta)*U[1]+a[0]*np.sin(alpha)*np.cos(beta)*U[2]
alphadot=q-(p*np.cos(alpha)+r*np.sin(alpha))*np.sin(beta)/np.cos(beta)+a[4]*V-a[14]*cmcg-a[8]*np.sin(alpha)*U[0]/V+a[8]*np.cos(alpha)*U[2]/V
betadot=p*np.sin(alpha)-r*np.cos(alpha)+a[16]*V+a[17]*smcg-a[9]*np.cos(alpha)*np.sin(beta)*U[0]/V+a[22]*np.cos(beta)*U[1]/V-a[9]*np.sin(alpha)*np.sin(beta)*U[2]/V
pdot=a[5]*q*r+a[17]*p*q+a[18]*V**2-a[19]*smcg+a[23]*U[0]-a[28]*U[2]+a[24]*np.sin(alpha)*np.cos(beta)*U[1]
qdot=a[10]*p*r+a[6]*(r**2-p**2)+a[20]*V**2-a[21]*sg+a[29]*U[0]-a[25]*U[2]+a[26]*np.sin(alpha)*np.sin(beta)*U[1]
rdot=a[11]*p*q-a[12]*q*r+a[13]*V**2+a[27]*np.cos(alpha)*U[2]
phidot=p+q*np.sin(phi)*np.tan(theta)+r*np.cos(phi)*np.tan(theta)
thetadot=q*np.cos(phi)-r*np.sin(phi)
return[Vdot,alphadot,betadot,pdot,qdot,rdot,phidot,thetadot]
y0=[0.01,0.2,0,0,0,0,0,0.1]
t0=0
V=[]
alpha=[]
beta=[]
p=[]
q=[]
r=[]
phi=[]
theta=[]
t=[]
r=ode(aero).set_integrator('dopri5',method='bdf',nsteps=1e10)
r.set_initial_value(y0,t0)
t1=10
dt=.01
while r.successful() and r.t<t1:
r.integrate(r.t+dt)
V.append(r.y[0])
alpha.append(r.y[1])
beta.append(r.y[2])
p.append(r.y[3])
q.append(r.y[4])
r.append(r.y[5])
phi.append(r.y[6])
theta.append(r.y[7])
t.append(r.t)
V=np.array(V)
alpha=np.array(alpha)
beta=np.array(beta)
p=np.array(p)
q=np.array(q)
r=np.array(r)
phi=np.array(phi)
theta=np.array(theta)
plt.plot(t,V)
plt.show()
将numpy导入为np
将matplotlib.pyplot作为plt导入
从scipy.integrate导入odeint
输入数学
将参数_投影导入为pp
从scipy.integrate导入ode
作为sm导入sympy
c=10
k、 k1,k2,k3=10,9,8,7
预计到达时间=2.5
伽马,伽马1,伽马2=2,3,10
a=[]
对于范围(30)内的i:
a、 附加(i)
a=np.数组(a)
def空气动力(t,Y):
五、 α,β,p,q,r,φ,θ=Y[0],Y[1],Y[2],Y[3],Y[4],Y[5],Y[6],Y[7]
sg=np.cos(α)*np.cos(β)*np.sin(θ)-np.sin(β)*np.sin(φ)*np.cos(θ)-np.sin(α)*np.cos(β)*np np.cos(φ)*np
smcg=np.cos(α)*np.sin(β)*np.sin(θ)+np.cos(β)*np.sin(φ)*np.cos(θ)-np.sin(α)*np.sin(β)*np.cos(φ)*np cos(θ
cmcg=np.sin(θ)*np.sin(α)+np.cos(α)*np.cos(φ)*np.cos(θ)
#错误
ev=V-np.sin(t)
ebeta=βnp.sin(t)
eteta=θnp.sin(t)
乙醚=q*np.cos(phi)-r*np.sin(phi)-np.cos(t)
sv、sbeta、SSETA=ev、ebeta、ETETA+ETETETAD
s=np.数组([[sv]、[sbeta]、[SSETA]])
A=np.A=A=np.A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A=A[A[1[1[1[1]A[1]A[1[1]A[1[1[1]A[1[1]A[1]A[1[1[2]A[1]A[1[1[1[1]A[1[1[1[1]A[1[1[1[1[1[1[1[1[1[1[1]V*V*V*2]V*2]V*V*V*V*V*V*2[2[2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2φ)*q*np.sin(φ)*np.tan(θ)-q*np.sin(φ)*r*np.cos(φ)*np.tan(θ)-np.sin(phi)*a[11]*p*q+a[12]*q*r-a[13]*V**2+r*np.cos(phi)*p+r*q*np.cos(phi)*np sin(phi)*np np.tan(θ)+(r*np.cos(phi))**2*np.tan(θ)-np.cos(t)])
B=np.数组([[a[0]*np.cos(α)*np.sin(β),a[7]*np.sin(β),a[0]*np.sin(α)*np.cos(β)],[-a[9]*np.cos(α)*np np.sin np(β)/V,a[22]*np sin(β)/V,-[a[9]*np.sin(α)*np.sin(β)/V],[a[29]*np.cos(φ),a[26]*np.sin(α)*np.sin(β)/np(β)/np.cos(β)]
C=np.linalg.inv(B)*A
U=(C-np.linalg.inv(B)*k*s-np.linalg.inv(B)*eta*np.tanh(s))
Vdot=a[0]*np.cos(alpha)*np.sin(beta)*U[0]-a[1]*V**2*np.cos(beta)-a[2]*V**2*np.sin(beta)-a[3]*sg+a[7]*np.sin(beta)*U[1]+a[0]*np sin(alpha)*np cos(beta)*U[2]
字母点=q-(p*np.cos(alpha)+r*np.sin(alpha))*np.sin(beta)/np.cos(beta)+a[4]*V-a[14]*cmcg-a[8]*np.sin(alpha)*U[0]/V+a[8]*np cos(alpha)*U[2]/V
betadot=p*np.sin(alpha)-r*np.cos(alpha)+a[16]*V+a[17]*smcg-a[9]*np.cos(alpha)*np.sin(beta)*U[0]/V+a[22]*np.cos(beta)*U[1]/V-a[9]*np sin(alpha)*np sin(beta)*U[2]/V
pdot=a[5]*q*r+a[17]*p*q+a[18]*V**2-a[19]*smcg+a[23]*U[0]-a[28]*U[2]+a[24]*np.sin(α)*np.cos(β)*U[1]
qdot=a[10]*p*r+a[6]*(r**2-p**2)+a[20]*V**2-a[21]*sg+a[29]*U[0]-a[25]*U[2]+a[26]*np.sin(α)*np sin(β)*U[1]
rdot=a[11]*p*q-a[12]*q*r+a[13]*V**2+a[27]*np.cos(α)*U[2]
φ点=p+q*np.sin(φ)*np.tan(θ)+r*np.cos(φ)*np.tan(θ)
thetadot=q*np.cos(φ)-r*np.sin(φ)
返回[Vdot、字母点、贝塔多、pdot、qdot、rdot、phidot、thetadot]
y0=[0.01,0.2,0,0,0,0,0,0.1]
t0=0
V=[]
alpha=[]
beta=[]
p=[]
q=[]
r=[]
phi=[]
θ=[]
t=[]
r=ode(航空)。设置积分器('dopri5',方法='bdf',nsteps=1e10)
r、 设置初始值(y0,t0)
t1=10
dt=.01
当r.successful()和r.t用于设置a[k]=k
的beta=phi=0
初始值时,矩阵B
在第一步中有第一行零。这构成了一个奇异矩阵
将测试数据更改为a[i]=i+1
会删除此错误,但会立即产生新错误
rv_cb_arr is NULL
Call-back cb_fcn_in___user__routines failed.
Traceback (most recent call last):
File "odeint-LA-singular_so45165407.py", line 60, in <module>
r.integrate(r.t+dt)
在这之后,您会发现对组件数组和ODE解算器都使用了变量名r
。修复您仍然得到的步长变得太小
(添加19年7月)根据注释使用变体
U = -C-np.linalg.solve(B,k*s - eta*np.tanh(s))
我将集成循环更改为
t0=0.
y0=[0.01,0.2,0.,0.,0.,0.,0.,0.1]
names = [ "V", "alpha", "beta", "p", "q", "r", "phi", "theta" ]
sol = [ [yy] for yy in y0 ]
t=[t0]
solver=ode(aero).set_integrator('dopri5',nsteps=1e3)
solver.set_initial_value(y0,t0)
t1=3
dt=5e-3
for t1 in range(1,11):
if not solver.successful(): break;
while solver.successful() and solver.t<t1:
solver.integrate(solver.t+dt)
for k in range(8): sol[k].append(solver.y[k]);
t.append(solver.t)
print "step"
print len(t)
for k in range(8):
plt.subplot(4,2,k+1)
plt.plot(t,sol[k])
plt.ylabel(names[k])
plt.show()
t0=0。
y0=[0.01,0.2,0,0,0,0,0,0,0,0.1]
名称=[“V”、“alpha”、“beta”、“p”、“q”、“r”、“phi”、“theta”]
sol=[[yy]表示y0中的yy]
t=[t0]
解算器=常微分方程(航空)。设置积分器('dopri5',nsteps=1e3)
解算器。设置初始值(y0,t0)
t1=3
dt=5e-3
对于范围(1,11)内的t1:
如果没有,则执行solver.successful():中断;
在solver.successful()和solver.tHi中,我尝试了您的解决方案,我将解决方案名称从r更改为s,但是现在步长变得非常小。我仍然无法得到图形。设置dt=1e-8
,并绘制alpha
,以查看其导数是否无穷大,也就是说,alpha
的行为类似于sqrt(t\u sing-t)
其中奇点位于t\u sing=4.50321260794985854e-06
。现在还不清楚是什么导致了这种行为。嗨!LutzL实际上代码中有一个错误,我将U的表达式改为-C-np.linalg.solve(B,ks-etanp.tanh(s))。而且我认为在ks和etanp.tanh(s)之间会有一个加号而不是减号。但是现在运行代码要花很多时间,事实上它已经运行了5-10分钟了!是的,这改变了奇点的位置。对于进度报告,请在衍生工具函数中打印t
(和其他值),以查看内部步骤或仅在积分循环中打印。前进t1
以整数步1,2,3,。。。获取一些图形输出,以查看解决方案的振荡程度,以及驱动内部步长减小的转角的锐度。嗨@LutzL首先,非常感谢你得到这些图表,实际上,我正试图在推力矢量飞行器上实现滑模控制。现在,当我试图在我的系统中运行代码时,它花费了我很多时间!我的意思是我从早上8点开始运行代码,一直运行到晚上6点我离开的时候。此外,V、beta和
t0=0.
y0=[0.01,0.2,0.,0.,0.,0.,0.,0.1]
names = [ "V", "alpha", "beta", "p", "q", "r", "phi", "theta" ]
sol = [ [yy] for yy in y0 ]
t=[t0]
solver=ode(aero).set_integrator('dopri5',nsteps=1e3)
solver.set_initial_value(y0,t0)
t1=3
dt=5e-3
for t1 in range(1,11):
if not solver.successful(): break;
while solver.successful() and solver.t<t1:
solver.integrate(solver.t+dt)
for k in range(8): sol[k].append(solver.y[k]);
t.append(solver.t)
print "step"
print len(t)
for k in range(8):
plt.subplot(4,2,k+1)
plt.plot(t,sol[k])
plt.ylabel(names[k])
plt.show()