我想将n阶常微分方程简化为一阶方程组.这是为数值分析做准备.我使用Sympy和Sagemath作为计算机代数,但我没有找到任何函数来进行这种类型的缩减.我不确定是否有其他人可以指出Sympy或Sagemath中是否存在此功能.
这方面的一个例子是减少等式:
x''' - 2x'' + x' = 0
Run Code Online (Sandbox Code Playgroud)
到一阶方程组:
[0 1 0
0 0 1
0 -1 2]
Run Code Online (Sandbox Code Playgroud) 我想对这样的 numpy 数组做一些求和
import numpy as np
import sympy as sy
import cv2
i, j = sy.symbols('i j', Integer=True)
#next read some grayscale image to create a numpy array of pixels
a = cv2.imread(filename)
b = sy.summation(sy.summation(a[i][j], (i,0,1)), (j,0,1)) #double summation
Run Code Online (Sandbox Code Playgroud)
但我正面临一个错误。是否可以将 numpy 符号作为 numpy 数组的索引处理?如果不是,你能给我一个解决方案吗?谢谢。
在 PyCharm 社区版 2016.2.3 + Anaconda 发行版中使用 python 2.7。
我有一个类似的输入:
from sympy import *
x = symbols('x')
f = cos(x)
print (f.subs(x, 25))
Run Code Online (Sandbox Code Playgroud)
输出为cos(25), 。有没有办法在某个角度评估三角恒等式,例如正弦/余弦?我试过了cos(degrees(x)),但没有什么不同。我是否遗漏了文档的某些关键部分,或者真的没有办法做到这一点?泰为您提供帮助:)
我有一组几百个简单的求和方程。例如这里有3个:
w1 - u1 - u2 = 0
w1 + w2 - w3 - u3 = 0
w1 - w2 - w4 = 0
Run Code Online (Sandbox Code Playgroud)
我试图找到一种方法来解决尽可能多的问题,只给出少数几个值。例如,在上面的方程组中,如果我有u1并且u2我可以计算w1,但没有别的。鉴于u1,u2并且w2我可以计算w1和w4。等等……
目前我正在以一种相当直接的方式(伪代码)处理这个问题:
while there are new results:
for each equation:
try to solve equation:
if solved update result set
Run Code Online (Sandbox Code Playgroud)
这有效,但感觉笨拙且效率低下。
有没有更好的办法?(如果相关,则使用 Python)
编辑:我知道这可以作为一系列线性方程来解决,如果我知道足够的值。我正在寻找一种方法,当我不知道作为线性方程组求解时使用的方法(或者可能有一种奇特的方法可以以某种方式减少问题)
编辑 2:错误,已删除
编辑 3:对于使用 sympy 对我的解决方案感兴趣的任何人:
from sympy import linsolve, symbols, linear_eq_to_matrix
w1, w2, …Run Code Online (Sandbox Code Playgroud) 为了计算导数和其他表达式,我使用了 sympy 包并说T = sy.Symbol('T')现在我已经计算了正确的表达式:
E= -T**2*F_deriv_T(T,rho)
Run Code Online (Sandbox Code Playgroud)
在哪里
def F_deriv_rho(T,rho):
ret = 0
for n in range(5):
for m in range(4):
inner= c[n,m]*g_rho_deriv_rho_np*g_T_np
ret += inner
return ret
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
F_deriv_rho: [0.0 7.76971e-5*T 0.0001553942*T**2*rho
T*(-5.14488e-5*log(rho) - 5.14488e-5)*log(T) + T*(1.22574e-5*log(rho)+1.22574e-5)*log(T) + T*(1.89488e-5*log(rho) + 1.89488e-5)*log(T) + T(2.29441e-5*log(rho) + 2.29441e-5)*log(T) + T*(7.49956e-5*log(rho) + 7.49956e-5)*log(T)
T**2*(-0.0001028976*rho*log(rho) - 5.14488e-5*rho)*log(T) + T**2*(2.45148e-5*rho*log(rho) + 1.22574e-5*rho)*log(T) + T**2*(3.78976e-5*rho*log(rho) + 1.89488e-5*rho)*log(T) + T**2*(4.58882e-5*rho*log(rho) + 2.29441e-5*rho)*log(T) + T**2*(0.0001499912*rho*log(rho) + 7.49956e 5*rho)*log(T)]
使用python我想将T(和rho)作为一个符号更改为一个值。我怎么能那样做?
因此,我想创建 10 个类似的数字,T_def = np.arange(2000, 10000, …
如何从(不等式/关系)对象中获取结果并将其转换为(设置/间隔)对象?
import sympy
import sympy.solvers
#import sympy.solvers.inequalities
from sympy.solvers.inequalities import reduce_rational_inequalities
x = sympy.Symbol('x')
ExampleInequalities1 = [[x**2 <= 1]]
ResultDomain1 = reduce_rational_inequalities(ExampleInequalities1, x)
print 'ResultDomain1', ResultDomain1
Run Code Online (Sandbox Code Playgroud)
给我:
>>> And(-1 <= x, x <= 1)
Run Code Online (Sandbox Code Playgroud)
上面的结果可以表示为:
>>> sympy.Interval(-1, 1)
Run Code Online (Sandbox Code Playgroud)
这是一个 Sympy Set Interval 对象。(这让我可以使用交集、联合、互补等......)。
如何执行此转换?
我想检查一个 python 变量是一个 sympy 表达式。很容易检查它是否是一个 sympy 变量:
isinstance(arg, symbol.Symbol)
Run Code Online (Sandbox Code Playgroud)
但我找不到怎么做:
isinstance(arg, sympy.Expression)
Run Code Online (Sandbox Code Playgroud)
是否可以检查python变量是否包含sympy表达式或变量?
作为快速检查,我做了:
expr2 = x-y
type(expr2)
<class 'sympy.core.add.Add'>
Run Code Online (Sandbox Code Playgroud)
但我不想有一个巨大的系列 if 语句子句检查每种可能的数学表达式类型。似乎多余/愚蠢。
能够检测变量何时属于任何类型的 sympy 相关事物,然后对其采取行动(然后可能稍后检查它是否是表达式或更详细的东西......)
我需要以字符串的形式接受用户输入,将其解析为一个 sympy 表达式,然后求解一个变量。除了 log2(x) 等价于 sympy 的 log(x, 2) 之外,大多数用户允许的函数都匹配 sympy 函数。
我试着定义为提到,返回sympy功能的Python函数的方法在这里。我也尝试过使用 lambda 定义一个 sympy 函数。这两种方法都可以在用变量替换数字后获取表达式的值,但如果调用 sympy.solve 来求解变量,则会产生错误。例如:
import sympy
from sympy.parsing.sympy_parser import parse_expr
def log2(x):
return sympy.log(x, 2)
t, k, y = sympy.symbols('t k y')
parsed = parse_expr("log2(t + k) + k - y")
sympy.solve(parsed, k)
Run Code Online (Sandbox Code Playgroud)
引发 NotImplementedError。使用 lambda 返回类似的结果。如果 log2(t+k) 替换为 log(t+k,2),则上述代码有效。我认为这是因为 sympy 函数是具有许多不同方法的对象,并且 sympy.solve 尝试调用未在我的 python 函数中实现的方法。我正在寻找一种解决方案,它不需要为我的函数创建一个与log的实现长度相同的类。有没有办法让 sympy 识别并使用 log2 而不创建一个长类来处理每个可能的调用?我可以以某种方式创建一个简短的类定义,将任何方法调用传递给 log(x, 2) 吗?
我不明白indexed objects同情的是什么.文档没有帮助我理解这个概念.
例如 :
>>> from sympy import symbols, IndexedBase, Idx
>>> M = IndexedBase('M')
>>> i, j = symbols('i j', cls=Idx)
>>> M[i, j]
M[i, j]
Run Code Online (Sandbox Code Playgroud)
这段代码有什么作用?什么是M[i,j]?
我所理解的是,它indexed object给出了个人同情的指数symbols.
我正在寻找一个更好的解释indexed objects,以及它与IndexedBase和的关系idx
为什么log(xy)= log(x)+ log(y)在SymPy中不起作用?
我试过这个:
from sympy import *
var('x y')
print(simplify(log(x*y)))
print(expand(log(x*y)))
print(collect(log(x*y),x))
print(solve(log(x*y),x))
# log(x*y)
# log(x*y)
# log(x*y)
# [1/y]
Run Code Online (Sandbox Code Playgroud) sympy ×10
python ×8
numpy ×2
inequality ×1
math ×1
ode ×1
performance ×1
recursion ×1
sage ×1
set ×1
symbols ×1
trigonometry ×1
variables ×1