牛顿法python

时间:2017-07-10 01:20:21

标签: python

好的,所以我发现这个代码用于使用牛顿方法查找函数的根,但我需要一种方法将函数作为输入插入。我尝试了所有我知道的。

这是一个编程基础课程,所以它需要尽可能简单。非常感谢你的帮助。

修改

我需要的是让用户插入该功能。我不想让它成为代码的一部分。

有一个更明确的解释:

我需要输入提示,我要求用户提供功能(即“请插入你的功能:2 * x ** 2 + 6 * x + 12”)

和另一个函数的衍生物(即“请插入衍生物:4 * x + 6)

让程序找到与发布的一样的根,而不将它们作为正确代码的一部分。

注意:这是我第一次在这里发布并且编程不是我的区域,但我总是在这里找到答案。请耐心等待,谢谢你的帮助。

def dx(f, x):
return abs(0-f(x))

def newton_metodo(f, df, x0, e):
    delta = dx(f, x0)
    while delta > e:
        x0 = x0 - f(x0)/df(x0)
        delta = dx(f, x0)
    print ('Raiz esta en: ', x0)
    print ('f(x) en la raiz es: ', f(x0))

def f(x):
    return 6*x**5-5*x**4-4*x**3+3*x**2

def df(x):
    return 30*x**4-20*x**3-12*x**2+6*x

x0s = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1]
for x0 in x0s:
    newton_metodo(f, df, x0, 1e-5)

1 个答案:

答案 0 :(得分:1)

请注意,您永远不应该在不受信任的用户输入上使用eval,并且永远不会在生产代码中使用eval!

def user_fn(user_function_string,**kwargs):
    for key,val in kwargs.items():
        user_function_string=user_function_string.replace("%s"%key,"%s"%val)
    print "user fn:",user_function_string
    #NOTE USING EVAL ON UNTRUSTED DATA IS A VERY VERY VERY BAD IDEA!!!!
    return eval(user_function_string)

for i in range(3,8):
    print (user_fn("2*x**2-1",x=i))

创建用户函数的更好方法是提示他们输入系数

if sys.version_info[0] >= 3: raw_input = input
order = int(raw_input("Enter Order of function (ie max power of x):"))
coefs = [int(raw_input("how many x**%d?"%i for i in range(order,-1,-1)]

def process_coefs(coefs,x):
    return sum(n*x**i for i,n in coefs[::-1])

print(process_coefs(coefs,x=3))
print(process_coefs(coefs,x=5))