方程求根(二分法和牛顿迭代法)
2017-12-18 23:50
387 查看
一、实验内容
以方程:x3-0.2x2-0.2x-1.2=0为例,编写程序求方程的根编写二分法、迭代法、牛顿法程序,分析运行结果
二、代码(python)
import matplotlib.pyplot as plt #计算原函数值 def compute_function_value(x): return x**3-0.2*(x**2)-0.2*x-1.2 #计算迭代式的值 def compute_iteration_value(x): return -0.05*(x**3)+0.01*(x**2)+1.01*x+0.06 #计算牛顿迭代式的值 def compute_newton_iteration_value(x): return x-(x**3-0.2*(x**2)-0.2*x-1.2)/(3*(x**2)-0.4*x-0.2) #用零点定理判断区间是否有根 def zero_theorem(x1,x2): r=(compute_function_value(x1)*compute_function_value(x2)) if(r<=0): return True else: return False ''' 二分法 a:左区间 b:右区间 cache_x:缓存每次迭代的x值 epslion:精度 ''' def dichotomy(a,b,cache_x,epslion): k=1 while((b-a)>=epslion or k==1): mid=(a+b)/2.0 cache_x.append(mid) if(compute_function_value(mid)*compute_function_value(b)<0): a=mid else: b=mid k=k+1 return mid ''' 迭代法 x0:初值 cache_x:缓存每次迭代的x值 epslion:精度 ''' def iterative_method(x0,cache_x,epslion): cache_x.append(x0) #缓存初值 x1=compute_iteration_value(x0) #计算迭代式的值并赋给x1 cache_x.append(x1) #缓存 #判断,不满足精度则循环 while(abs(x1-x0)>epslion): x0=x1 x1=compute_iteration_value(x0) cache_x.append(x1) return x1 #返回最后结果 #牛顿迭代法 def newton_iterative_method(x0,cache_x,epslion): cache_x.append(x0) #缓存初值 x1=compute_newton_iteration_value(x0) #计算牛顿迭代式的值并赋给x1 cache_x.append(x1) #缓存 #判断,不满足精度则循环 while(abs(x1-x0)>epslion): x0=x1 x1=compute_newton_iteration_value(x0) cache_x.append(x1) return x1 #返回最后结果 #主控程序 def main(): cache_x=[] #保存x的每次的值,以便绘图 a=float(input("Please enter the left interval a:")) #输入左区间a b=float(input("Please enter the left interval b:")) #输入右区间b #有根情况 if(zero_theorem(a,b)): #选择菜单 choose=int(input("There are three methods now: \n\ 1 : dichotomy\n\ 2 : iterative_method\n\ 3 : newton_iterative_method\nPlease choose one method(use number):")) epslion=float(input("please enter the epslion:")) #输入精度 #各种选择情况 if(choose==1): x1=dichotomy(a,b,cache_x,epslion) elif(choose==2): x0=float(input("please enter the initial value x0:")) x1=iterative_method(x0,cache_x,epslion) else: x0=float(input("please enter the initial value x0:")) x1=newton_iterative_method(x0,cache_x,epslion) #绘图 plt.plot(cache_x,'or') plt.show() print('approximate solutions:',x1) else: #无根情况 print('The equation has no root in the interval') if __name__=='__main__': main()
三、实验结果
同一精度(0.00000001)下:二分法程序运行结果:
迭代法程序运行结果:
牛顿迭代法程序运行结果:
同一精度(0.00000001)下,初值对迭代法的影响:
四、感悟
无论选那种方法,都要首先进行有根区间的判断。三者速度的比较(当精度要求为0.00000001时):牛顿迭代法>二分法>迭代法
迭代法中迭代式的选取一定要满足其求导后的绝对值在区间内恒小于1。
当不好找迭代式时,可以采用待定系数法来求迭代式,即如图:
不同的初值对迭代法的影响非常大,如实验所示,当初值取为1.2时只要迭代一次,而取1.5时则迭代70多次。所以取初值时,可以采用二分法取得一个好的初值,在迭代。
python在科学计算领域还是比较好用的,且matplotlib中的绘图工具能可视化的输出迭代结果,能更好的进行错误纠正及展示。
相关文章推荐
- 用牛顿迭代法和二分法求方程的根【C语言】
- 习题 7.12 用牛顿迭代法求根。方程为ax^3+bx^2+cx+d=0,系数a,b,c,d的值依次为1,2,3,4,由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。
- 1、编写程序,分别用二分法和牛顿迭代法求解方程x3 – 3x – 1 = 0在x = 2附近的实根,要求计算精确到小数点后七位数字为止,并将求出的近似结果与理论值2cos20 相比较,二分法的初始迭代
- 关于使用牛顿迭代法和二分法解方程的算法说明
- 牛顿迭代法和二分法求方程的根
- 求解一元多次方程的两种方法:牛顿迭代法和二分法
- 牛顿迭代法求近似根与二分法求根
- 关于使用牛顿迭代法和二分法解方程的算法说明
- 方程求根二分法
- 方程求根二分法
- 牛顿迭代法求解方程
- 二分法求方程的近似解
- 【uva10341】二分法解方程,注意单调性
- 方程求根!
- 一元二次求根方程
- C语言(11)--回文日、确定等式、fflush(stdin)、将十进制数转换成n进制数、二分法解方程
- 提高项目18-二分法解方程
- 工程计算2——非线性方程求根
- 二分法解方程
- 1088 习题5-15 二分法求方程的根