您可能知道,也可能不知道,由某个函数定义的变量中不确定性的公式。
由以下机构提供:
。
我想要创建一个python函数来完成这个任务。这就是我目前的情况:
import sympy as sp
from sympy import lambdify, symbols,diff
L,g = symbols('L g', real=True)
value_of_var = [5.4,9.8] # Arbitrary values for L and g
uncertainty_in_var = [0.3, 0.1]
function = 2*sp.pi*sp.sqrt(L/g) #Period of pendulum (purely for test purposes)
variables = [L,g]
def uncertainty_calculator(function):
partials = [diff(function,x) for x in variables] #Takes partial derivatives of variables
partial_times_uncertainty = [(x*y)**2 for x,y in zip(uncertainty_in_var,partials)] #Squares the product of the uncertainty and its respective partial
uncertainty = lambdify(variables, sp.sqrt(sum(partial_times_uncertainty)))
number = uncertainty(value_of_var[0],value_of_var[1])
return number
uncertainty = uncertainty_calculator(function)
print(uncertainty)我很肯定这对于这个特定的函数很好,但是,我想把它概括得更多,我希望它包含一个值的列表,这些值的不确定性,以及一个函数,给我不确定性。问题是,如果我的变量已经有了一个值,那么这个函数就被求为一个数字,因此在计算偏导数时我得到了零,这是由symbols('L g', real=True)线固定的,它使函数保持未求值,直到它到达lamdify部分。有谁知道这是怎么做到的,拥有这样的功能对我的实验室确实有帮助,因为用手计算这个函数是件很痛苦的事。
发布于 2022-03-22 20:27:41
如果函数不是一元函数,那么您必须始终指定函数,然后指定符号及其值。如果您是交互式地使用此方法,则可以通过将函数作为字符串传递给输入,并按照与变量排序顺序相对应的值来减少输入。然后,函数的返回可以是一个替换字典(因此您可以检查)和计算的不确定性。
>>> def ucalc(f, x, u):
... f = S(f)
... syms = list(ordered(f.free_symbols))
... assert len(x) == len(u) == len(syms)
... reps = dict(zip(syms, x))
... ui = IndexedBase('u')
... args = []
... for i, xi in enumerate(syms):
... reps[ui[xi]] = u[i]
... args.append((ui[xi]*diff(f, xi))**2)
... return reps, sqrt(Add(*args)).n(subs=reps)
...
>>> ucalc('2*pi*sqrt(L/g)',(9.8,5.4),(.1,.3))
({L: 9.8, g: 5.4, u[L]: 0.1, u[g]: 0.3}, 0.239055276534314)请注意,IndexedBase符号用于为不确定性创建临时变量,因为这些变量不会出现在方程本身中。
发布于 2022-03-21 17:46:57
似乎您暗示symbols('L g', real=True)解决了这个问题,我不明白是什么问题。可能是因为我还没有使用过这个库,但是您能多指定一些问题吗?
https://stackoverflow.com/questions/71561834
复制相似问题