我是Sympy的新手,所以如果我问一个简单的问题,请提前道歉。
假设我们有一个方程z = x * y ^ 2
from sympy import *
x,y,z = symbols('x y z')
z = x * y**2
现在让我们说我想通过仅更改一个变量来比较由该方程式控制的2种情况。
z1 = x1 * y^2 ---(1)
z2 = x2 * y^2 ---(2)
Sympy中有一种方法可以将(1)乘以(2),例如,给我结果吗?
z1/z2 = x1/x2
理想情况下,我想找出的是该方程对于给定参数的敏感性,而不必一遍又一遍地重新键入整个方程组。
答案 0 :(得分:2)
这是您可以选择的一条路线:
subs(var, expr)
substitutes一个表达式的变量。 -expr.simplify()
simplifies表达式。该示例可能类似于:
from sympy import symbols
x,y,z = symbols('x y z')
x1, x2 = symbols('x1 x2')
z = x * y**2
div = z.subs(x, x1) / z.subs(x, x2)
print(div.simplify())
输出:
x1/x2
在这种情况下,simplify()
并不是严格必需的,因为立即简化已经给出了x1/x2
。请注意,simplify
上有很多变体,例如expand
,factor
和cancel
,它们各自为简化提供了不同的解释。
答案 1 :(得分:0)
这里是使用Python SALib进行灵敏度分析的示例。在我的示例中,我正在执行敏感性分析。这不使用SymPy,但允许对任何复杂功能进行严格的灵敏度分析。此示例应适合SymPy的修改。
我通过Google Colab笔记本环境进行了以下示例。
此示例假定您已安装 SALib 。
! pip install salib
import numpy as np
from SALib.sample import saltelli
from SALib.analyze import sobol
def z(x):
#column 0 is x and column 1 is y
return x[:,0]*x[:,1]**2
xMax=10; #change this to suit your needs
yMax = 10; #change this to suit your needs
problem = {'num_vars': 2,
'names': ['x', 'y'],
'bounds': [[0, xMax],
[0, yMax]]}
# Generate samples
nSamples = 5000; #typically a large number of samples are required (think 100,000)
param_values = saltelli.sample(problem, nSamples, calc_second_order=True)
# Run model
Y = z(param_values)
# Perform analysis
Si = sobol.analyze(problem, Y,calc_second_order=True)
print('First order sensitivity of y with respect to z and b:', Si['S1'], 'respectively.')
print('Second order sensitivity of y with respect to z and b:', Si['S2'], 'respectively.')
您可能会发现有用的其他资源