我正在尝试使用python解决以下问题

我正在尝试使用python解决以下问题,python,Python,我正在尝试编写一个代码,在给定一些变量的情况下发现流程的高级阶段不确定性,但是我的代码运行不正常,我需要一些帮助。这就是我试图解决的问题: 我编写了以下代码: from scipy.stats import t from sympy import diff, Symbol from sympy.parsing.sympy_parser import parse_expr '''exp = input('Enter the expression to find the propagatio

我正在尝试编写一个代码,在给定一些变量的情况下发现流程的高级阶段不确定性,但是我的代码运行不正常,我需要一些帮助。这就是我试图解决的问题:

我编写了以下代码:

from scipy.stats import t
from sympy import diff, Symbol
from sympy.parsing.sympy_parser import parse_expr
'''exp = input('Enter the expression to find the propagation of error: ')
var = input('Enter the variables containing uncertainty seperated by spaces: ').split()
rss = [float(v) for v in input('Enter the variables RSS as a value seperated by spaces (if its in %, multiply by mean): ').split()]
num=[float(v) for v in input('Enter the number of measurements of each variable seperated by spaces: ').split()]
values=[float(v) for v in input('Enter the mean of each variable seperated by spaces: ').split()]
std=[float(v) for v in input('Enter the standard deviation of each variable seperated by spaces: ').split()]'''
exp = 'p/(54.7*t)'
var = ['p','t']
rss = [22.5391,0.6]
num=[20,10]
values=[2253.91,560.4]
std=[167.21,3]
for i,j in zip(var, values):
    a=exp.replace(i, str(j))
    print(a)
x=eval(a)
print(x)
b=[]
s=[]
sv=[]
for i in range(len(rss)):
    temp=rss[i]/2
    b.append(temp)
for i in range(len(var)):
    sp=std[i]/((num[i])**0.5)
    temp=num[i] -1
    s.append(sp)
    sv.append(temp)
symb = {x:Symbol(x, real = True) for x in var}  
val_table = {symb[x]:v for x, v in zip(var, values)}
symb = {x:Symbol(x, real = True) for x in var}  
val_table = {symb[x]:v for x, v in zip(var, values)}
func = parse_expr(exp, symb)  
derivatives = [diff(func, symb[x]) for x in var]
print(derivatives)  
error_s = (sum((u)*d.evalf(subs=val_table)**2 for u, d in zip(s, derivatives)))**0.5
error_b = (sum((u)*d.evalf(subs=val_table)**2 for u, d in zip(b, derivatives)))**0.5
print(error_s)
print(error_b)
vsk=[]
vbk=[]
for i in range(len(s)):
    v=((s[i])**4)/sv[i]
    vsk.append(v)
    s[i]=s[i]**2
for i in range(len(b)):
    b[i]=b[i]**2
sx=(sum(s))**0.5
print('the random uncertainty is: ',sx)
bx=(sum(b))**0.5
print('The systematic uncertainty is: ',bx)
cux=round((((sx)**2)+((bx)**2))**0.5,2)
print('The combined standard uncertainty is: ',cux)
den1=sum(vsk)
den2=sum(vbk)
v=round((((cux**2)**2)/(den1+den2)),0)
print('The degrees of freedom is: ',v)
tdist=t.ppf(1-((1-(95/100))/2), v)  
ecu=tdist*cux
print('The best estimate is:+/-',ecu)

我的最终答案是80,而不是0.0026,并且我无法计算x;我认为我的错误在于导数,我希望有人能帮助我。非常感谢

您有一些小错误。我建议将来使用一些较长的变量名,以便其他人更容易了解他们所指的是什么,特别是如果您正在寻求帮助的话。还请尝试遵循以下规则,特别是当它涉及到运算符周围的空格时,这将使您的代码更具可读性

在实现方面,您有3个问题

第一期(括号) 错误和错误计算周围的括号不正确

(总和((u)*d.evalf(SUB=val_表)**2表示u,d表示zip(s,衍生品))**0.5
#^这个
应该是

(总和((u*d.evalf(subs=val_表))**2表示u,d(s,衍生品))**0.5
#我应该在这里的
由于这个原因,您只是对求值导数的值进行平方处理,而不是对整个产品进行平方处理

以下是实现的正确行:

error_s=(sum((u*d.evalf(subs=val_table))**2表示压缩编码中的u,d(s,导数))**0.5
错误_b=(总和((u*d.evalf(subs=val_表))**2表示压缩中的u,d(b,导数))**0.5
第二个问题(逻辑错误) 其次,您没有正确计算估算值。 您使用的是
sx
sb
来构建
cux
,而不是使用先前计算的
error\s
error\u b
值。我不知道这是否是因为您的
error\uu
变量包含不正确的信息,所以这是第二次尝试,但将其替换为更正的
error\u
变量会产生预期的结果

ecu=t\u dist*((错误**2+错误**2)**0.5)
假设您已经更新了
error\u s
error\u b
行以匹配上述行,您可以在程序中替换
ecu
分配,并且您的程序将产生预期的结果,而无需进一步修改

第三期(第十期) 您的代码产生了一个错误

zip中i,j的
(变量,值):
a=经验替换(i,str(j))
x=评估值(a)
或者,您可以直接在
func
上使用
evalf
from
sympy
,因为您已经在计算导数时设置了它

x=func.evalf(subs=val_表)
修改的实现 为了试图理解这个问题和您的实现,我最后做了一些修改,尽可能简化表达式。我试图保留尽可能多的变量名。我还剥离了一些没有直接朝着计算总不确定性的目标取得进展的行动,因为这是你问题中的问题所在。如果这些计算对您问题中列出的要求以外的其他要求很重要,请重新引入这些计算

我的完整修改实现如下所示:

从scipy.stats导入t
从sympy导入差异,符号
从sympy.parsing.sympy\u解析器导入parse\u expr
exp='p/(54.7*t)'
var=['p','t']
rss=[22.5391,0.6]
num=[20,10]
数值=[2253.91560.4]
标准=[167.21,3]
b=[b1/2表示rss中的b1]
s=[]
sv=[]
对于拉链中的s1、n1(标准,数字):
sp=s1/(n1**0.5)
s、 附加(sp)
附加sv(n1-1)
symbols={x:var}中x的Symbol(x,real=True)
val_table={sy:v代表sy,v在zip中(symbols.values(),values)}
#计算导数
func=parse_expr(exp,符号)
导数=[sy在符号中的差异(func,sy)。值()]
已评估的_导数=[d.evalf(subs=val_表)对于导数中的d]
#估计密度不确定性
误差_s,误差_b=[(总和((u*ed)**2表示u,ed在zip中(l,求值的_导数))**0.5表示l在[s,b]]
#找到等效的#自由度
v_num=(总和((u*ed)**2代表u,压缩中的ed(s+b,求值的_导数*2))**2
v_denom=sum(sum((u*ed)**4)/v表示u,ed,v表示zip(l,求值的u导数,sv))表示l表示[s,b])
v=浮动(v_num/v_denom)
打印(f'自由度为:{v:.0f}')
#总不确定度
t_dist=t.ppf(1-((1-(95/100))/2),v)
ecu=t_dist*((错误**2+错误**2)**0.5)
#用值替换对表达式求值
x=函数评估(subs=val_表)
打印(f'最佳估计值为:{x:.3f}+/-{ecu:.4f}')

您有一些小错误。我建议将来使用一些较长的变量名,以便其他人更容易了解他们所指的是什么,特别是如果您正在寻求帮助的话。还请尝试遵循以下规则,特别是当它涉及到运算符周围的空格时,这将使您的代码更具可读性

在实现方面,您有3个问题

第一期(括号) 错误和错误计算周围的括号不正确

(总和((u)*d.evalf(SUB=val_表)**2表示u,d表示zip(s,衍生品))**0.5
#^这个
应该是

(总和((u*d.evalf(subs=val_表))**2表示u,d(s,衍生品))**0.5
#我应该在这里的
由于这个原因,您只是对求值导数的值进行平方处理,而不是对整个产品进行平方处理

以下是实现的正确行:

error_s=(sum((u*d.evalf(subs=val_table))**2表示压缩编码中的u,d(s,导数))**0.5
错误_b=(总和((u*d.evalf(subs=val_表))**2表示压缩中的u,d(b,导数))**0.5
第二个问题(逻辑错误)
Traceback (most recent call last):
  File "script.py", line 20, in <module>
    x = eval(a)
  File "<string>", line 1, in <module>
NameError: name 'p' is not defined