也许这是向您展示代码并稍后再解释的最简单方法:
sigma_aussen = 7.1
roh_aussen = 38
lambda_schreib = 532*10**-9
lambda_rek = 432*10**-9
sigma_aussen=radians(sigma_aussen)
roh_aussen=radians(roh_aussen)
def BraggMatch(sigma_aussen, roh_aussen, n_brech, lambda_schreib, lambda_rek):
gw2, sig_innen, ref_innen, sig_din, ref_din, p2, sig, ref =var('gw2 sig_innen ref_innen sig_din ref_din p2 sig ref')
sigma = asin(1/n_brech*sin(sigma_aussen))
roh = asin(1/n_brech*sin(roh_aussen))
gw = (sigma+roh)/2
sigma_din = (roh-sigma)/2
roh_din = (sigma-roh)/2
gw2 = (asin(1/n_brech*sin(sig))+asin(1/n_brech*sin(ref))/2)
print("gw2: ", gw2)
sig_innen = asin(1/n_brech*sin(sig))
ref_innen = asin(1/n_brech*sin(ref))
print ("sig_innen: ", sig_innen)
print ("ref_innen: ", ref_innen)
sig_din = gw2-sig_innen
ref_din = gw2-ref_innen
print ("ref_din: ", ref_din)
p = lambda_schreib/(n_brech*(sin(sigma_din)-sin(roh_din)))
print ("p: ",p)
p2 = lambda_rek/n_brech*(sin(sig_din)-sin(ref_din))
print ("p2: ", p2)
Winkel=nsolve([gw-gw2, p-p2],[sig,ref], [0,0])
return Winkel
Winkel = BraggMatch(sigma_aussen, roh_aussen, n_brech, lambda_schreib, lambda_rek)
这里我的解释是:BraggMatch是一种以弧度返回两个角度的方法。在
这两个方程是gw-gw2=0和p-p2=0。gw和p是两个已知的变量。只有两个变量是未知的,sig和ref。这两个未知变量应该通过数值求解并在BraggMatch方法中返回。在
用Maple软件求解这两个方程是没有问题的。也许它会有所帮助,向您展示解决方案:sig=0.064和ref=0.734
这是错误:“ValueError:无法在给定的容差内找到根。(东经16851-16851) 尝试另一个起点或调整参数。“
你帮我解决了这个问题,让我非常感激。这是我硕士论文的核心。在
首先,谢谢你的快速回复。在
但我不认为这是正确的方法。你说得对,我忘了n_brech=1.5
。
今天,我发现,gw-gw2
可以解决分析问题。所以我只需要p-p2
的解决方案。
ref
和{sigma_aussen, roh_aussen, lambda_rek
的变化,这就是我开始寻找0的解的原因。在
这里是我的新代码:
^{pr2}$如果你擅长Maple,在我上传的图片中,你可以看到我在Python中必须解决的问题,因为在这里我可以用VPython可视化它。Maple代码以度为单位返回角度,这没有问题。
现在我试着写代码,就像我在Maple中做的那样。我得到一些现在的错误:
ZeroDivisionError
代码如下:
n_brech = 1.5
sigma_aussen = 7.1
roh_aussen = 38
lambda_schreib = 532*10**-9
lambda_rek = 432*10**-9
sigma_aussen=radians(sigma_aussen)
roh_aussen=radians(roh_aussen)
def BraggMatch(sigma_aussen, roh_aussen, n_brech, lambda_schreib, lambda_rek):
sig, ref =var('sig ref')
def sigma(n_brech, sigma_aussen):
return (asin(1/n_brech*sin(sigma_aussen)))
def roh(n_brech, roh_aussen):
return (asin(1/n_brech*sin(roh_aussen)))
def gw(n_brech, sigma_aussen, roh_aussen):
return ((sigma(n_brech, sigma_aussen)+roh(n_brech, roh_aussen))/2)
def sigma_din(n_brech, sigma_aussen, roh_aussen):
return (gw(n_brech, sigma_aussen, roh_aussen)-sigma(n_brech, sigma_aussen))
def roh_din(n_brech, sigma_aussen, roh_aussen):
return (gw(n_brech, sigma_aussen, roh_aussen)-roh(n_brech, roh_aussen))
def p(n_brech, sigma_aussen, roh_aussen, lambda_schreib):
return (lambda_schreib/(n_brech*(sin(sigma_din(n_brech, sigma_aussen, roh_aussen))-sin(roh_din(n_brech, sigma_aussen, roh_aussen)))))
return (nsolve([gw(n_brech, sigma_aussen, roh_aussen)-gw(n_brech, sig, ref), p(n_brech, sigma_aussen, roh_aussen, lambda_rek)-p(n_brech, sig, ref, lambda_schreib)], [sig, ref], [0, 0]))
Winkel=BraggMatch(sigma_aussen, roh_aussen, n_brech, lambda_schreib, lambda_rek)
我不明白为什么它不起作用。。。在
这个问题也可以用数值方法解决,例如用
scipy.optimize.minimize()
:但是我不得不猜测
n_brech = 1
,因为它的值没有在问题中显示出来。scipy.optimize.minimize()
确实找到了一个解决方案([ 0.3148574 0.1574287]
),但它与Maple发现的不同。在如果不知道方程的来源和它们的意图,我就不能确定它们是否正确地表达出来。不过,我可以检查多种解决方案。从
[0.064, 0.734]
开始优化,而不是在[0, 0]
开始优化,得到的结果是[ 0.0340574 0.7190287]
。在因此,这些方程似乎有多个解,并且(至少对于
n_brech
的值),如果从不同的点开始优化,则会找到不同的解。在(进一步编辑)
为了研究多种解决方案,我使用了以下代码:
^{pr2}$。。。产生以下输出:
。。。从中可以看出,在感兴趣的范围内,沿曲线存在许多局部极小值。因此,不同的方法(和不同的软件)可以找到不同的最小值,对此我并不感到惊讶。在
相关问题 更多 >
编程相关推荐