gpt4 book ai didi

python - 使用 for 循环和 if 语句求根迭代

转载 作者:太空宇宙 更新时间:2023-11-03 21:03:53 26 4
gpt4 key购买 nike

我正在使用 python 进行根查找迭代。

我首先定义了 F(x)。

def F(x):
return 0.01-0.4*x+x**2/(1+x**2)

我还定义了 dFdx。

def dFdx(x):
return -0.4+2*x/((1+x**2)**2)

下面是我的寻根代码

def Testing_Root(x, F, dFdx):
# store the values of x_n in a list, xstore
# first, make an initial list with an initial guess x_0
xstore = [x]
# calculate differences in each iteration and store in a list, difference
# first, make an empty list
difference = []
print('n=0, x[0] =', x)
for i in range(50):
x = x - F(x)/dFdx(x)
xstore.append(x)
for j in range(50):
d = xstore[j+1] - xstore[j]
difference.append(d)
for k in range(50):
print('n=', k+1, 'x[', k+1, ']=', xstore[k+1], 'difference is', difference[k])
for j in range(k, 50):
if all(abs(difference[j]) < 0.000000000001):
break
break
return print('so the root is', round(x, 4), 'to 4dp')

当我使用 x=-0.1 的求根函数时

In [38]: Testing_Root(-0.1, F, dFdx)
n=0, x[0] = -0.1
n= 1 x[ 1 ]= 0.0004950332214986031 difference is 0.10049503322149861
so the root is 0.0268 to 4dp

在我的函数中,我想检查它是否收敛到根。另外,我不想打印所有迭代。如果所有 k>= 点的差异小于 0.000000000001,我希望它在某个点停止打印迭代。所以我在 for 循环中使用了 if 循环('for k in range(50) : if all(abs(difference[j])<0.0000001): break' 部分)。然而,它并没有像我预期的那样工作。它在 n=1 后停止打印,但 n=2 时的差异是 0.02306141...这显然大于 0.000000000001。为什么它不起作用?我应该在代码中更改什么?

最佳答案

需要解决的三个简单问题:

  • all 旨在处理可迭代的对象(想想:“在列表上”)。通过将 for 循环放在 all 调用之外,您就欺骗了 all 的功能。相反,将整个感兴趣的列表传递给 all 并且根本不循环。
  • 另一方面, abs< 不适用于可迭代对象!相反,使用 Python 强大的 列表理解通过逐个元素操作生成列表。语法 difference[k:] 表示 difference 中从索引 k 到末尾的所有元素。
  • 您的 break 循环中有一个杂散 k,它每次都会在第一次迭代后中断循环。

因此您的 k 循环应如下所示:

for k in range(50):
print('n=', k+1, 'x[', k+1, ']=', xstore[k+1], 'difference is', difference[k])
if all([abs(n)<0.000000000001 for n in difference[k:]]):
break

输出是:

n=0, x[0] = -0.1
n= 1 x[ 1 ]= 0.0004950332214986031 difference is 0.10049503322149861
n= 2 x[ 2 ]= 0.025061418498996398 difference is 0.024566385277497795
n= 3 x[ 3 ]= 0.0267848938218123 difference is 0.001723475322815901
n= 4 x[ 4 ]= 0.02679343238175541 difference is 8.538559943111618e-06
n= 5 x[ 5 ]= 0.026793432591266996 difference is 2.0951158516413493e-10
n= 6 x[ 6 ]= 0.026793432591266996 difference is 0.0
so the root is 0.0268 to 4dp

关于python - 使用 for 循环和 if 语句求根迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55553615/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com