Sympy:灵敏度分析

时间:2020-05-18 02:39:42

标签: sympy

我是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 

理想情况下,我想找出的是该方程对于给定参数的敏感性,而不必一遍又一遍地重新键入整个方程组。

2 个答案:

答案 0 :(得分:2)

这是您可以选择的一条路线:

该示例可能类似于:

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上有很多变体,例如expandfactorcancel,它们各自为简化提供了不同的解释。

答案 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.')

您可能会发现有用的其他资源

  1. YouTube video由SALib的作者撰写。
  2. http://www.sfu.ca/~ssurjano/ishigami.html
  3. https://risk-engineering.org/notebook/sensitivity-analysis.html