我编写了一个非常适合数值求解方程的代码,但是有一个特定的方程,当我进入那里并尝试运行该代码时,它将运行并且不会输出任何结果!等式I的输出为:x ^ 3-3 * x + 2-a *(np.sin(x))公式I没有得到以下输出:(x-1)(x-2)(x-3)-a *(np.cos(x))我还尝试编写不带括号的第二个方程,像这样:x ^ 3-6 * x ^ 2 + 11 * x-6-a * np.cos(x)并没有帮助。问题出在哪里?!
这是我的代码:
import math
import numpy as np
h =1e-5
eps =1e-8
#function of the equation
def nf(x,a,c):
c=math.cos(x)
solu=(x-1)*(x-2)*(x-3)-a*c
return(solu)
#numerical method
def sl(a,x):
c=math.cos(x)
f = nf(x,a,c)
while abs(f)>eps:
x = x - h*f/(nf(x+h,a,c)-f)
f = nf(x,a,c)
return(x)
N = 101
mya = np.linspace(0.0,1.0,N)
myb = np.zeros(mya.shape)
myc = np.zeros(mya.shape)
myd = np.zeros(mya.shape)
for i in range(0,N):
myb[i] = sl(mya[i],1.0)
myc[i] = sl(mya[i],2.0)
myd[i] = sl(mya[i],3.0)
print(myb[i])
print(myc[i])
print(myd[i])
问题是,对于sl
的某些输入,abs(f)>eps
可能永远不会成为False
,从而形成无限循环。我没有调查过您的数学问题,因此无法“真正”解决此问题。我可以提供的是自动检测何时发生这种情况,以便代码运行:
def sl(a,x):
c=math.cos(x)
f = nf(x,a,c)
count, maxcount = 0, 1000
while abs(f)>eps:
x = x - h*f/(nf(x+h,a,c)-f)
f = nf(x,a,c)
count += 1
if count > maxcount:
return
return(x)
此处,在认为解决方案不可达之前,最多允许1000
次迭代。在这种情况下,sl
返回None
,当将其插入NumPy float
数组时将变为np.nan
。
在调查输出时,只有myc[60]
以这种方式失败。