首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一维动力系统的点稳定性误差

一维动力系统的点稳定性误差
EN

Stack Overflow用户
提问于 2022-10-26 14:21:31
回答 1查看 25关注 0票数 0

我正在研究python中的两个不同的系统,寻找不动点及其稳定性。成功地解决了第一个问题,但是使用相同的方法会产生一个错误,我不知道如何在第二个方法中处理。

代码语言:javascript
复制
TypeError: loop of ufunc does not support argument 0 of type Zero which has no callable exp method

我真的不知道如何处理它,因为当我为这个错误做了一个例外,我只是跳过答案,我确信有可能的答案和分析,我认为他们没有理由不存在。

代码语言:javascript
复制
from sympy import *  
from numpy import *
from matplotlib import pyplot as plt

r = symbols('r', real=True)
x = symbols('x', real =True)
#first one
fx =r*x+((x**3)/(1+x**2)) # DEf. both fet and right side in EQ
fps = solve(fx, x)
print(f"The fixed points are: {fps}")


dfx = lambdify(x,fx.diff(x))

for fp in fps:
    stable_interval = solve_univariate_inequality(dfx(fp)<0, r, domain=Reals, relational=False)
    unstable_interval = solve_univariate_inequality(dfx(fp)>0, r, domain=Reals,  relational=False)
    #print(type(stable_interval))
    print(f"{fp} is stable when {stable_interval}")
    #print(type(unstable))
    print(f"{fp} is unstable when {unstable_interval}")
代码语言:javascript
复制
fx2 = r*x+( x* E**x)
fps2 = solve(fx2, x)
print(f"The fixed points are: {fps}")

dfx2 = lambdify(x,fx2.diff(x))

for fp in fps2:
    stable_interval = solve_univariate_inequality(dfx2(fp)<0, r, domain=Reals, relational=False)
    unstable_interval = solve_univariate_inequality(dfx2(fp)>0, r, domain=Reals,  relational=False)
    #print(type(stable_interval))
    print(f"{fp} is stable when {stable_interval}")
    #print(type(unstable))
    print(f"{fp} is unstable when {unstable_interval}")

我希望我创建的方法可以应用到第二个系统fx2中,但我不明白为什么这不是真的。

EN

回答 1

Stack Overflow用户

发布于 2022-10-26 20:26:12

奥斯卡在评论中提到,不要混入明星进口:那是正确的!让我们了解一下你在做什么:

  1. with from sympy import *您正在从from sympy import *中导入所有东西,比如cossin、.
  2. from numpy import *,您是从numpy导入所有东西,比如cossin、.但是,许多东西都有相同的名称,因此您实际上是在重写以前的导入。结果:一塌糊涂,这肯定会引起错误,因为您的名称空间现在包含指向numpy的名称和指向同情的其他名称。Numpy和Sympy不能很好地合作!

解决问题的最佳方法。把事情分开,像这样:

代码语言:javascript
复制
import sympy as sp
import numpy as np

或只从一个模块导入所有内容:

代码语言:javascript
复制
from sympy import *
import numpy as np

现在,谈谈你的实际问题。使用此命令:

代码语言:javascript
复制
dfx2 = lambdify(x,fx2.diff(x))
# where fx2.diff(x) results in:
# r + x*exp(x) + exp(x)

lambdify创建了一个数值函数,该函数将由Numpy计算:请注意,该函数包含一个指数,即Numpy指数。然后,使用dfx2(fp)计算这个函数,其中fp是一个符号对象(意思是,它是Sympy对象)。如前所述,Numpy和Sympy并不能很好地合作。

最简单的解决方案:要求lambdify创建一个由Sympy评估的函数:

代码语言:javascript
复制
dfx2 = lambdify(x, fx2.diff(x), "sympy")

现在,一切都如期而至。

或者,您不使用lambdify。相反,您可以将值替换为符号表达式。例如:

代码语言:javascript
复制
dfx2 = fx2.diff(x)
for fp in fps2:
    stable_interval = solve_univariate_inequality(dfx2.subs(x, fp)<0, r, domain=Reals, relational=False)
    unstable_interval = solve_univariate_inequality(dfx2.subs(x, fp)>0, r, domain=Reals,  relational=False)
    #print(type(stable_interval))
    print(f"{fp} is stable when {stable_interval}")
    #print(type(unstable))
    print(f"{fp} is unstable when {unstable_interval}")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74209365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档