我正在尝试将从此函数计算的数据写入文件中。但该函数被称为次数。假设另一个文件中有9个数字,此函数将计算这9个数字中的每个数字的根。来自此函数的这9个根应该写在同一个文件中。但我在这里完成它的方式将在文件中写入计算的根,但下一个将在文件中替换它。在调用此函数之前,还会为这9个数字中的每一个执行其他数学函数,因此这些函数会一次又一次地被调用。是否可以将它们全部写在同一个文件中?谢谢。
def Newton(poly, start):
""" Newton's method for finding the roots of a polynomial."""
x = start
poly_diff = poly_differentiate(poly)
n = 1
counter = 0
r_i = 0
cFile = open("curve.dat", "w")
while True:
if (n >= 0) and (n < 1):
break
x_n = x - (float(poly_substitute(poly, x)) / poly_substitute(poly_diff, x))
if x_n == x:
break
x = x_n # this is the u value corresponding to the given time
n -= 1
counter += 1
x = str(x)
cFile.write('\n' + x + '\n')
if r_i:
print "t(u) = ", (x, counter)
else:
print "t(u) = ", x
cFile.close
按照我的建议后,我将代码更改为以下内容:
def Newton(poly, start):
""" Newton's method for finding the roots of a polynomial."""
x = start
poly_diff = poly_differentiate(poly)
n = 1
counter = 0
while True:
if (n >= 0) and (n < 1):
break
x_n = x - (float(poly_substitute(poly, x)) / poly_substitute(poly_diff, x))
if x_n == x:
break
x = x_n # this is the u value corresponding to the given time
n -= 1
counter += 1
yield x
Bezier(x)
def Bezier(u_value) :
""" Calculating sampling points using rational bezier curve equation"""
u = u_value
p_u = math.pow(1 - u, 3) * 0.7 + 3 * u * math.pow(1 - u, 2) * 0.23 \
+ 3 * (1 - u) * math.pow(u, 2) * 0.1 + math.pow(u, 3) * 0.52
p_u = p_u * w
d = math.pow(1 - u, 3) * w + 3 * u * w * math.pow(1 - u, 2) + 3 * (1 - u) *\
w * math.pow(u, 2) + math.pow(u, 3) * w
p_u = p_u / d
yield p_u
plist = list (p_u)
print plist
我在Bezier()函数中执行了相同的操作,但是没有创建plist,因为它不会打印任何内容。请帮忙。谢谢。
答案 0 :(得分:2)
你的函数两件事:它计算多项式的根,并将结果写入输出文件。功能理想情况下应该一件事。
因此,尝试将其分解为接收多项式的函数并返回包含根的列表,然后只需一步就将该列表写入文件。
修改函数的最简单方法是替换行
x = str(x)
cFile.write('\n' + x + '\n')
与
yield x
然后你可以这样调用你的函数:
roots = list(Newton(polynomial, start))
要理解这一点,请阅读generators。要将结果列表写入文件,可以使用以下代码:
with open("curve.dat", "w") as output_file:
output_file.write("\n".join(str(x) for x in roots)
答案 1 :(得分:1)
虽然我不完全理解你在问什么,但我认为答案可归结为:
以追加模式打开文件,而不是写入模式。而不是
cFile = open("curve.dat", "w")
DO
cFile = open("curve.dat", "a")
答案 2 :(得分:0)
为什么在Bezier中使用yield,它不会返回多个值,因此您可以更改:
yield p_u
plist = list (p_u)
print plist
为:
print list(p_u)
return p_u