我想找到满足方程式的点(x,y)
A((x-x0)^ 2)+ 2B(x-x0)(y-y0)+ C((y-y0)^ 2)= deltachi2
使用python。这是我的代码
import math
deltachi2=2.3 #2.3 for 1-sigma and 6.18 for 2-sigma
A=3.
B=2.
C=1.1
x0=1.5
y0=3.
x_ini=1.
x_fin=2.
y_ini=2.
y_fin=4.
number_of_x_devisions=100
delta_x= float(x_fin-x_ini)/float(number_of_x_devisions)
number_of_y_devisions=100
delta_y= float(math.log10(y_fin)-math.log10(y_ini))/float(number_of_y_devisions)
filename="test.txt"
outfile=open(filename,"w")
for i in range(number_of_x_devisions+1):
x_i=x_ini+ i*delta_x
for j in range(number_of_y_devisions+1):
y_j=y_ini * pow(10,(delta_y*j))
XX=A*pow((x_i-x0),2)+2.*B*(x_i-x0)*(y_j-y0)+C*pow((y_j-y0),2)
if XX==deltachi2:
outfile.write("%1.12e %1.12e %1.12e\n"%(x_i,y_j,XX))
outfile.close()
正如我说的,我需要找到一组点(x,y),它们使等高线图成为1σ和2σ(1-sigam的deltachi2为2.3,而2σ的为6.18)。但是,以上代码给出了空白输出。如何正确找到轮廓?
答案 0 :(得分:0)
您的上述代码存在缩进问题; for j
循环应嵌套在for i
循环内,以扫描两个“维度”。
此外,由于您正在使用浮点数学运算(并且使用朴素网格搜索而不是更好的算法),因此可能找不到确切的解决方案,因此您需要使用epsilon或准确性阈值来找到近似解。
此外,我对您的代码进行了一些重构,以将x_i
和y_j
值的生成移到生成器函数中,因此问题本身更易于阅读。
import math
def x_gen(x_ini, x_fin, num_div):
delta_x = float(x_fin - x_ini) / float(num_div)
for i in range(num_div):
yield x_ini + i * delta_x
def y_gen(y_ini, y_fin, num_div):
delta_y = float(math.log10(y_fin) - math.log10(y_ini)) / float(num_div)
for j in range(num_div + 1):
yield y_ini * pow(10, (delta_y * j))
EPSILON = .01
deltachi2 = 2.3 # 2.3 for 1-sigma and 6.18 for 2-sigma
A = 3.
B = 2.
C = 1.1
x0 = 1.5
y0 = 3.
for x_i in x_gen(1, 2, 100):
for y_j in y_gen(2, 4, 100):
XX = (
A * pow((x_i - x0), 2)
+ 2. * B * (x_i - x0) * (y_j - y0)
+ C * pow((y_j - y0), 2)
)
err = abs(XX - deltachi2)
if err < EPSILON:
print((x_i, y_j, XX, err))
此代码打印出了两种可能的解决方案(我也添加了打印错误):
(1.0, 2.411615655381521, 2.307584439928287, 0.007584439928287168)
(1.01, 2.394957409237857, 2.3088676681935825, 0.008867668193582645)
(1.02, 2.378414230005442, 2.3096504347952513, 0.009650434795251517)
(1.03, 2.3619853228590606, 2.309936594096949, 0.009936594096949136)
(1.04, 2.3456698984637576, 2.309730056780758, 0.009730056780758112)
(1.05, 2.3294671729369116, 2.309034788099698, 0.009034788099698154)
(1.06, 2.3133763678105748, 2.3078548061624873, 0.00785480616248746)
(1.07, 2.29739670999407, 2.3061941802500714, 0.006194180250071568)
(1.08, 2.2815274317368472, 2.3040570291634124, 0.004057029163412551)
(1.09, 2.265767770591597, 2.3014475196020174, 0.0014475196020176107)
(1.1, 2.250116969377619, 2.298369864572757, 0.0016301354272427737)
(1.11, 2.23457427614444, 2.2948283218284615, 0.0051716781715382965)
(1.12, 2.21913894413569, 2.290827192335828, 0.009172807664171945)
(1.18, 2.1140360811227605, 2.304659088270414, 0.00465908827041428)
(1.19, 2.0994333672461347, 2.2971249106473923, 0.002875089352607496)
(1.23, 2.027918959580058, 2.307983227711846, 0.00798322771184612)
(1.24, 2.0139111001134378, 2.2979409062094645, 0.0020590937905353712)
(1.77, 3.9723699817481437, 2.3089132998333692, 0.008913299833369415)
(1.8, 3.9176811903477073, 2.2975700722470327, 0.0024299277529671315)
(1.88, 3.784230586902383, 2.301749866868204, 0.0017498668682041085)
(1.9100000000000001, 3.7321319661472296, 2.2946153619215264, 0.005384638078473447)
(1.99, 3.6050018504433208, 2.3087335898127352, 0.00873358981273542)