Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:numpy.linalg.linalg.linalgeror:奇异矩阵_Numpy_Ode_Differential Equations - Fatal编程技术网

Python:numpy.linalg.linalg.linalgeror:奇异矩阵

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

我正在尝试使用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 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()