利用直线趋近的这么一个思想,不断交换x、x0
终止条件有两种判断方式:
- x0和x之间的误差非常小
- f(x)的值趋近与0
# 以f = x**3 + 3*x**2 + 3*x + 2
# df = 3**2 + 6*x + 3
def f(x):
f = x ** 3 + 3 * x ** 2 + 3 * x + 2
return f
def df(x):
df = 3 * x ** 2 + 6 * x + 3
return df
def newton(x):
global i
x0 = x
print('第{}次迭代:'.format(i), end='')
print('f(x) =', f(x0), end=' ')
print('df(x) =', df(x0))
x = x0 - f(x0)/df(x0)
print('x =', x, 'x0 =', x0, abs(x0-x))
if abs(x0-x) < 1e-6:
return x
else:
i += 1
return newton(x) # 这里没有return的话,函数返回None
i = 1
x0 = -3
x = newton(x0)
print('该方程的解为:', x)
上面的代码需要自己进行求导,比较麻烦,下面给出进阶版
def f(fk, x):
fp = eval(fk)
return fp
def df(fk, x):
dfp = (f(fk, x + 0.0001)-f(fk, x))/0.0001
return dfp
def newton(x):
global i
x0 = x
print('第{}次迭代:'.format(i), end='')
print('f(x) =', f(fk, x0), end=' ')
print('df(x )=', df(fk, x0))
x = x0 - f(fk, x0)/df(fk, x0)
print('x =', x, 'x0 =', x0, abs(x0-x))
if abs(x0-x) < 1e-6:
return x
else:
i += 1
return newton(x) # 这里没有return的话,函数返回None
i = 1
x0 = -3
fk = input('请输入函数表达式:(用x作为自变量)\\n')
x = newton(x0)
print('该方程的解为:', x)
这里对直接利用(f(x+△x)-f(x))/△x求出来导函数的值