我遇到以下代码的问题。它目前正在进行中,但我遇到的一个大问题是,无论我尝试过什么类型的输入,我的函数输入都会返回错误。它返回时出现错误类型的问题,或者如果我输入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'
答案 0 :(得分: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)
返回一个数字,那么你的代码会起作用)
答案 1 :(得分:1)
您遇到的问题是您的函数f
使用的名称与您在代码第一行中收集的公式字符串相同。但是,只是修改名称不会做你想要的,我不认为。
您的f
函数需要评估公式,以获得数值结果。我想你想要这个:
formula = raw_input("Please enter function: y' = ")
def f(x, y):
return eval(formula)
虽然这有效,但我想指出一般不建议使用eval
,特别是当您评估的字符串来自用户时。那是因为它可以包含任意Python代码,这些代码将被运行。 eval('__import__(os).system("rm -Rf *")')
可能真的毁了你的一天(不要运行这段代码!)。