1

我对以下代码有疑问。它目前正在进行中,但我遇到的一个大问题是,无论我尝试过什么类型的输入,我的函数输入都会返回错误。如果我输入诸如 x 之类的函数,它要么返回错误类型的问题,要么返回未定义 x 的问题。

f = raw_input("Please enter function: y' = ")
x0 = float(raw_input("Please enter the initial x value: "))
y0 = float(raw_input("Please enter the initial y value: "))
xmax = float(raw_input("Please enter the value of x at which to approximate the solution: "))
h = float(raw_input("Please enter the step size: "))
showall = int(raw_input("Would you like to see all steps (1) or only the approximate solution (2)? "))

def f(x,y):
    value = f
    return (value)

def euler(x0,y0,h,xmax):
    x=x0; y=y0; xd=[x0]; yd=[y0];

    while x<xmax:
        y = y + h*f(x,y)
        yd.append(y)
        x=x+h
        xd.append(x)
    return(xd,yd)

(xvals,yvals) = euler(x0,y0,h,xmax)



if showall == 1:
    print ""
    print "x_n y_n"
    for uv in zip(xvals, yvals):
        print uv[0],uv[1]
elif showall == 2:
    print ""
    print "x_n y_n"
    print xvals, yvals  
else:
    print ""
    print "There has been an error with your choice of what to see; showing all steps."
    print ""
    print "x_n y_n"
    for uv in zip(xvals, yvals):
        print uv[0],uv[1]

print " "       
plotask = int(raw_input("Would you like to see a plot of the data? Yes (1); No (2) "))

if plotask == 1:
    print "1"
elif plotask == 2:
    pass
else:
    print ""
    print "Could not understand answer; showing plot."

任何帮助,将不胜感激。

错误和跟踪如下:

   File "C:\Users\Daniel\Desktop\euler.py", line 25, in <module>
      (xvals,yvals) = euler(x0,y0,h,xmax)
   File "C:\Users\Daniel\Desktop\euler.py", line 19, in euler
      y = y + h*f(x,y)
TypeError: unsupported operand type(s) for *: 'float' and 'function'
4

2 回答 2

2

这个功能:

def f(x,y):
    value = f
    return (value)

可以看出返回一个函数。特别是,它除了返回自身,什么都不做f。(注意f不同于f()f(x,y)

y = y + h*f(x,y)

评估为

y = y + h*f

这是一个错误,因为f它是一个函数,并且您不能将一个函数乘以一个数字(与评估函数调用的结果相反 - 例如,如果f(x,y)返回一个数字,那么您的代码将起作用)

于 2013-05-16T03:27:08.393 回答
1

您遇到的问题是您的函数f使用的名称与您在代码的第一行中收集的公式字符串相同。但是,我不认为,仅修复名称不会满足您的要求。

您的f函数将需要评估公式,以获得数字结果。我想你想要这个:

formula = raw_input("Please enter function: y' = ")

def f(x, y):
    return eval(formula)

虽然这可行,但我确实想指出,eval通常不推荐使用 using,尤其是当您正在评估的字符串来自用户时。那是因为它可以包含将运行的任意 Python 代码。eval('__import__(os).system("rm -Rf *")')真的会毁了你的一天(不要运行这段代码!)。

于 2013-05-16T03:39:23.453 回答