我编写了一个非常适合数值求解方程的代码,但是有一个特定的方程,当我进入那里并尝试运行该代码时,它将运行并且不会输出任何结果!
方程式我得到了x ^ 3-3 * x + 2-a *(np.sin(x))的输出
方程式我没有得到以下输出:(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]
以这种方式失败。
您的nf函数有点奇怪。您正在将c = math.cos(x)
传递到nf()中,但是在nf()中,您试图再次分配c to math.cos(x)
。只需使用您传递的值c
。注释掉可以修复您的代码。至于数学的正确性,除非您提供更好的解释,否则我无法确定。
import math
import numpy as np
h =1e-5
eps =1e-8
#function of the equation
def nf(x,a,c):
# this line is not needed. Commenting allows your code to run
# 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])
输出:
3.2036907284
0.835006605064
0.677633820877