BIT数值分析 方程(组)的迭代解法 迭代法、牛顿法、双点弦截法 简单例子

题目

5.分别用迭代法、牛顿法、双点弦截法(x0=2, x1=1.9)求方程x3-3x-1=0在x=2附近的根

 

思路

回去看PPT

代码

# 迭代法、牛顿法、双点弦截法
# 题目:求x^3-3*x-1=0在x=2附近的根,双点弦截法(x0=2,x1=1.9)

import math
import sympy as sp

def fun(x):
	return pow(x,3) - 3*x - 1;

def DiedaiIteration(x):
	# 迭代公式
	# sqrt()
	# pow(x, 1/3)
	return ( 1 + 3*x ) ** (1./3) 

def diedai(p):
	# 判断收敛
	# 迭代公式一阶导
	judge = abs( ( 1 + 3*p )**(-2./3) )
	print(f"|φ'x| = {judge}")

	if(judge < 1 ):
		cha = 99999
		i = 0
		print(f"x{i} = {p}")

		x1 = p
		x2 = DiedaiIteration(x1)
		cha = abs( x2 - x1 )
		print(f"x{i+1} = {x2:06f}, 差cha = {cha:06f}")
		while(cha > 0.00001):
			x1 = x2
			x2 = DiedaiIteration(x2)
			cha = abs( x2 - x1 )
			i += 1
			print(f"x{i+1} = {x2:06f}, 差cha = {cha:06f}")
	else:
		print("迭代公式一阶导|x=({p}) >= 1,不确定收敛性")

def NewtonIterat(x):
	# 牛顿迭代公式:x(n+1) = xn-(f(xn)/f'(xn))
	# 公式不简化
	# return x - (fun(x) / ( 3 * x**2 - 3 ))
	# 公式简化
	return (2 * x**3 + 1) / ( 3 * ( x**2 - 1 ) )

def newton(p):
	# 1 形成迭代公式 NewtonIterat()
	# 2 确定初值: 
	#   在[a,b]满足 f(a)f(b)<0 有根 && f'(x)!=0根唯一 && f(x)f''(x) > 0 不变号,则迭代收敛
	# fun(x0)*6*x0 =12 > 0

	# 3 迭代
	cha = 99999
	x = p
	i = 0
	print(f"x{i} = {x:6f}")
	while(cha > 1e-5):
		temp = NewtonIterat(x)
		cha = abs( temp - x )
		x = temp
		i += 1
		print(f"x{i} = {x:6f}, 差cha = {cha:6f}")
def XianjieIterat(x1,x2):
	return ( x1*fun(x2) - x2*fun(x1)  ) / ( fun(x2) - fun(x1) )

def xianjie(p1,p2):
	# 1 f(a)f(b) < 0 && f'(x) != 0 ,对任意x0,x1 ∈ [a,b] 收敛
	# 2 迭代 x(n+1) = ( x(n-1)*f(xn) - xn*f(x(n-1)) ) / (f(xn) - f(x(n-1)) )
	x1,x2 = p1,p2
	f1,f2 = fun(x1),fun(x2)
	
	cha = 999
	i = 0
	print(f"x{i} = {x1:6f}, f(x{i}) = {f1:6f}")
	i += 1
	print(f"x{i} = {x2:6f}, f(x{i}) = {f2:6f}")
	while(cha > 1e-6 ):
		x = XianjieIterat(x1,x2)
		f = fun(x)
		cha = abs(x-x2)
		x1 = x2
		x2 = x
		i += 1
		print(f"x{i} = {x:6f}, f(x{i}) = {f:6f}, 差cha = {cha:6f} ")
	return

def main():
	p = 2.0
	print("---------迭代法--------")
	diedai(p)

	print("---------牛顿法--------")
	newton(p)

	print("---------双点弦截法--------")
	p1,p2 = 1.9, 2.0
	xianjie(p1,p2)


main()

效果:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 目的: (1)通过采用牛顿迭代法弦截法和二分法的程序设计,使学生更加系统地理解和掌握C语言函数间参数传递方法、数和指针的应用等编程技巧。培养学生综合利用C语言进行科学计算,使学生将所学知识转化为分析和设计数学中的实际问题的能力,学会查资料和工具书。 (2)提高学生建立程序文档、归纳总结的能力。 (3)进一步巩固和灵活运用先修课程《计算机文化基础》有关文字处理、图表分析、数据归整、应用软件之间图表、数据共享等信息技术处理的综合能力。 2. 基本要: (1)要用模块化设计和C语言的思想来完成程序的设计; (2)要分别编写牛顿迭代法弦截法和二分法的函数,分别存到不同的.CPP文件中; (3)在VC++6.0环境中,学会调试程序的方法,及时查究错误,独立调试完成。 (4)程序调试通过后,完成程序文档的整理,加必要的注释。 一般解一元方程,常用采用的方法有:牛顿迭代法弦截法和二分法等。 牛顿迭代法 〖〖f(x)=a〗_0 x〗^n 〖〖 + a〗_1 x〗^(n-1) +⋯+〖 a〗_(n-2) x^2 +〖 a〗_(n-1) x +〖 a〗_n=0 f(x)在〖 x〗_0附近。 计算公式:〖 x〗_(n+1)=〖 x〗_n- f(〖 x〗_n )/(f(〖 x〗_n)) ́ 精度:ε=|〖 x〗_(n+1)-〖 x〗_n|<1.0e-m ,m=6。 牛顿迭代法:满足精度的〖 x〗_n 二分法 任取两点〖 x〗_1和〖 x〗_2,判断(〖 x〗_1, 〖 x〗_2)有无实。如下图所示,如果f(〖 x〗_1 )和f(〖 x〗_2 )符号相反,说明(〖 x〗_1, 〖 x〗_2)之间有一实。取(〖 x〗_1, 〖 x〗_2)的中点x,检查f(x)和f(〖 x〗_1 )是否同符号,如果不同号,说明实在(〖 x〗_1,x)区间,x作为新的〖 x〗_2,舍弃(x, 〖 x〗_2)区间;若同号,则实在(x, 〖 x〗_2)区间,x作为新的〖 x〗_1, 舍弃(〖 x〗_1,x)区间。再据新的〖 x〗_1 、 〖 x〗_2,找中点,重复上述步骤。直到|〖 x〗_1-〖 x〗_2|〖<10〗^(-6)时,x =(〖 x〗_1+〖 x〗_2)/2为所。 (3)弦截法 取f(〖 x〗_1 )与f(〖 x〗_2 )连线与x轴的交点x,从(〖 x〗_1, x)和(x, 〖 x〗_2)两个区间中取舍的方法与二分法相同。 计算公式为: 判断f(〖 x〗_1 )与f(〖 x〗_2 )是否同符号的方法与二分法采用的方法相同。直到先后两次出的x的值之差小于〖10〗^(-6)为止。 分别用牛顿迭代法弦截法和二分法下列方程,分析比较各种方法的迭代次数及精度。 〖f(x)=x〗^3 〖- 2x〗^2 +7x +4=0 牛顿迭代法的初值:x=0.5; 弦截法〖 x〗_1,〖 x〗_2的初值:-1,1 二分法〖 x〗_1,〖 x〗_2的初值:-1,0 精度要:|〖 x〗_1-〖 x〗_2| 〖<10〗^(-6)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值