Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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 避免绘制ODE发散解ODEint_Python_Numpy_Visualization_Ode - Fatal编程技术网

Python 避免绘制ODE发散解ODEint

Python 避免绘制ODE发散解ODEint,python,numpy,visualization,ode,Python,Numpy,Visualization,Ode,我想画一个相平面,我希望它看起来好看。然而,由于初始条件的存在,方程组的某些解会出现分歧。有没有什么方法可以让我按顺序创建一个try/except链,当解决方案出现分歧时,它不会绘制它。这是我的密码: import matplotlib.pyplot as plt import numpy as np from scipy.integrate import odeint import pylab as pl def aux_func(x): y = x[0]-x[1] if (n

我想画一个相平面,我希望它看起来好看。然而,由于初始条件的存在,方程组的某些解会出现分歧。有没有什么方法可以让我按顺序创建一个try/except链,当解决方案出现分歧时,它不会绘制它。这是我的密码:

import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
import pylab as pl 

def aux_func(x):  
  y = x[0]-x[1]
  if (np.abs(y) <= 1):
    f = y**3 + 0.5*y 
  else: 
    f = 2*y - np.sign(y)
  return f 

def function(x,t): 
  x1_dot = x[1]  
  x2_dot = -x[1] - aux_func(x)  
  return [x1_dot,x2_dot]

ts = np.linspace(0, 20, 300)  
ic_1 = np.linspace(-1,1,10)
ic_2 = np.linspace(-1,1,10) 

for r1 in ic_1:
  for r2 in ic_2:
    x0 = (r1,r2)
    try:
      xs = odeint(function, x0, ts)
      plt.plot(xs[:,0], xs[:,1],"r-",linewidth=.8) 
    except: 
      pass

# Nombre de los ejes, limites,
plt.xlabel("$x_1$", fontsize=12)
plt.ylabel("$x_2$", fontsize=12)
# plt.tick_params(labelsize=10)
# plt.xticks(np.linspace(0,1,11))
# plt.yticks(np.linspace(0,1,11))
plt.xlim(-1, 1)
plt.ylim(-1, 1)
# Grafica el campo vectorial
X1, X2 = np.mgrid[-1:1:20j,-1:1:20j]
u=X2
d= X1-X2

t = np.zeros(np.shape(d))
for i in range(len(d)):
    for j in range(len(d[0])):
        if np.abs(d[i][j]) > 1:
            t[i][j]= 2*d[i][j]-0.5*np.sign(d[i][j])
        else:
            t[i][j] =d[i][j]**3 + 0.5*d[i][j]
v=-X2-t

pl.quiver(X1, X2, u, v, color = 'b',width = .002)
plt.grid()
plt.title('Plano de Fase Punto 1')
#plt.savefig('FasePunto4.png')
plt.show()
导入matplotlib.pyplot作为plt
将numpy作为np导入
从scipy.integrate导入odeint
将pylab作为pl导入
定义辅助函数(x):
y=x[0]-x[1]
如果(np.abs(y)1:
t[i][j]=2*d[i][j]-0.5*np.符号(d[i][j])
其他:
t[i][j]=d[i][j]**3+0.5*d[i][j]
v=-X2-t
pl.箭袋(X1,X2,u,v,颜色='b',宽度=.002)
plt.grid()
plt.title('Plano de Fase Punto 1')
#plt.savefig('FasePunto4.png'))
plt.show()
代码正在绘制以下内容:


感谢您的帮助。

这可以通过完全避免错误的分歧来解决,因此不需要异常处理

这是一种不连续的常微分方程,可能导致像滑动模式这样的不寻常效果。快速解决这一问题的一种方法是通过实现一个混合区来缓和跳跃,其中向量场从一个阶段快速但连续地变化到另一个阶段(请参阅其他通用解决方法)。该变化可按如下方式实现:

def aux_func(x):  
  def softsign(u): return np.tanh(1e4*u)
  y = x[0]-x[1]
  h = 0.5*(1+softsign(y**2-1)
  # h is about zero for |y|<1 and about 1 for |y|>1
  f1 = y**3 + 0.5*y          # for |y|<1
  f2 = 2*y - softsign(y)     # for |y|>1, note the second mollification
  return (1-h)*f1+h*f2 
定义辅助函数(x): def软设计(u):返回np.tanh(1e4*u) y=x[0]-x[1] h=0.5*(1+软符号(y**2-1) #对于| y | 1,h约为零 f1=y**3+0.5*y#对于| y | 1,注意第二个缓和 返回(1-h)*f1+h*f2 在代码没有进一步更改的情况下,这将给出绘图


请注意,
pylab
已过时,其所有功能也可以通过
plt=matplotlib.pyplot
访问。这可以通过避免错误的分歧来解决,因此不需要异常处理

这是一种不连续的常微分方程,可能导致像滑动模式这样的不寻常效果。快速解决这一问题的一种方法是通过实现一个混合区来缓和跳跃,其中向量场从一个阶段快速但连续地变化到另一个阶段(请参阅其他通用解决方法)。该变化可按如下方式实现:

def aux_func(x):  
  def softsign(u): return np.tanh(1e4*u)
  y = x[0]-x[1]
  h = 0.5*(1+softsign(y**2-1)
  # h is about zero for |y|<1 and about 1 for |y|>1
  f1 = y**3 + 0.5*y          # for |y|<1
  f2 = 2*y - softsign(y)     # for |y|>1, note the second mollification
  return (1-h)*f1+h*f2 
定义辅助函数(x): def软设计(u):返回np.tanh(1e4*u) y=x[0]-x[1] h=0.5*(1+软符号(y**2-1) #对于| y | 1,h约为零 f1=y**3+0.5*y#对于| y | 1,注意第二个缓和 返回(1-h)*f1+h*f2 在代码没有进一步更改的情况下,这将给出绘图

请注意,
pylab
已过时,其所有功能也可以通过
plt=matplotlib.pyplot
访问