为什么python代码在运行,但在使用公式时并没有输出?
我写了一个代码,非常适合数值求解方程,但我有一个特定的方程,当我进入其中并尝试运行代码时,它将运行,并且永远不会输出 方程我得到了一个输出: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) 但这没用<问题出在哪里强> 这是我的代码:为什么python代码在运行,但在使用公式时并没有输出?,python,output,equation,Python,Output,Equation,我写了一个代码,非常适合数值求解方程,但我有一个特定的方程,当我进入其中并尝试运行代码时,它将运行,并且永远不会输出 方程我得到了一个输出: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) 但这没用eps可能永远不会变成False,从而创建一个无限循环。我没有研究过你的数学问题,所以我不能“真正地”解决这个问题。我能提供
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
,当插入NumPyfloat
数组时,它将变成np.nan
在调查输出时,只有myc[60]
以这种方式失败。问题是,对于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
,当插入NumPyfloat
数组时,它将变成np.nan
在调查输出时,只有myc[60]
以这种方式失败。您的nf函数有点奇怪。您正在将c=math.cos(x)
传递到nf()中,但在nf()中,您再次尝试将c分配给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
你的nf功能有点奇怪。您正在将c=math.cos(x)
传递到nf()中,但在nf()中,您再次尝试将c分配给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