为什么运行python代码,但使用公式时却没有输出?

问题描述 投票:1回答:2

我编写了一个非常适合数值求解方程的代码,但是有一个特定的方程,当我进入那里并尝试运行该代码时,它将运行并且不会输出任何结果!

方程式我得到了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])
python output equation
2个回答
0
投票

问题是,对于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]以这种方式失败。


0
投票

您的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
© www.soinside.com 2019 - 2024. All rights reserved.