您可能知道也可能不知道,由某個函式定義的變數的不確定性公式由下式給出:
.
我想創建一個為我執行此操作的 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 部分。有誰知道如何做到這一點,擁有這樣的功能對我的實驗室真的很有幫助,因為手動計算該功能真的很痛苦。
uj5u.com熱心網友回復:
如果函式不是單變數的,那么您將始終必須指定函式,然后指定符號及其值。如果您以互動方式使用它,您可以通過將函式作為字串傳遞并且值的順序與變數的排序順序相對應來減少輸入。然后函式的回傳可以是替換字典(以便您檢查)和計算的不確定性。
>>> 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 符號用于為不確定性創建臨時變數,因為它們不會出現在方程本身中。
uj5u.com熱心網友回復:
看來您暗示可以symbols('L g', real=True)解決問題,我無法理解問題所在。可能是因為我沒有使用過這個庫,但你能詳細說明你的問題嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/449140.html
下一篇:如何在顫振中實作ln(x)
