计算方法——非线性方程的解法(二分法、试值法、迭代法)

Dara ·
更新时间:2024-09-21
· 631 次阅读

非线性方程的解法(python) 二分法 试值法 迭代法 二分法

1.简介
连续函数f(x)在根两边会变号,如果[a,b]区间有根,则f(a)*f(b)<0,令S1: e=(a+b)/2,If f (e)=0,e是根,end;ElseIf f(a)*f(e)<0,[a, e]中有根,Set b=e, go to S1;Else,[e, b]中有根,Set a=e, go to S1

2.结束二分法的条件
①有一个中点值使得f(x)=0;
②区间足够小时,小于一个提前设定的值delta时,即(a-b)<delta 时,则结束二分。

3.题目
【问题描述】如果在240个月内每月付款300美元,使用二分法在利率区间[a,b] 内,求能够满足在这240个月之后使本金和利息的总值达到50万美元的利率值(年利率为I,则月利率为 I/12),精确到小数点后第d位。

【输入形式】在屏幕上输入3个数,依次为利率区间左端点值a、右端点值b和精确到小数点后d位。各数间都以一个空格分隔。测试用例的输入满足:b>a>0, 1<=d<=8, d为正整数。

【输出形式】输出两行数据,第一行为迭代次数,第二行为求得的利率,保留d位小数。

【样例输入】

0.15 0.16 8

【样例输出】

20

0.15753931

【样例说明】输入:左端点值为0.15,右端点值为0.16,求得的利率精确到小数点后8位。输出:表示经 20 次迭代,求得满足条件的利率值为 0.15753931。

import math #输入并用空格分开 Enter=input() Num=Enter.split(" ") #字符型转换成数字 a=float(Num[0]) b=float(Num[1]) n=int(Num[2]) #总金额 sum=0.0 #用于后面计算迭代次数 temp1=a temp2=b #二分法 while abs(sum-500000.0)>0.1**n: c=(a+b)/2 sum = 3600 / c * ((1 + c / 12) ** 240 - 1) suma=3600/a*((1+a/12)**240-1) sumb=3600/b*((1+b/12)**240-1) if (sum-500000)*(suma-500000)>0: a=c else: b=c #迭代次数 print(int((math.log(temp2-temp1)-math.log(0.1**n))/math.log(2))+1) #利率结果 print(round(c,n)) 试值法

1.简介
假设f(a)*f(b)<0,求得经过点(a, f(a))和(b, f(b)) 的割线L与x轴的交点(e, 0),该点更接近于根。
其中 e=b-(f(b)(b-a))/(f(b)-f(a))

2.结束试值法的条件
①最大循环次数
②根所在区间宽度
③f(e)<k,其中k是提前设定的一个数

3.题目(同上)
【问题描述】如果在240个月内每月付款300美元,使用试值法在利率区间[a,b] 内,求能够满足在这240个月之后使本金和利息的总值达到50万美元(允许误差范围为0.0001美元)的利率值,精确到小数点后第d位。

【输入形式】在屏幕上输入3个数,依次为利率区间左端点值a、右端点值b和精确到小数点后d位。各数间都以一个空格分隔。测试用例的输入满足:b>a>0, 1<=d<=8, d为正整数。

【输出形式】输出两行数据,第一行为迭代次数,第二行为求得的利率,保留d位小数。

【样例输入】

0.15 0.16 8

【样例输出】

5

0.15753931

【样例说明】输入:左端点值为0.15,右端点值为0.16,求得的利率精确到小数点后8位。输出:表示经5次迭代,求得满足条件的利率值为0.15753931。

【评分标准】根据输入得到的输出准确

import math #输入并用空格分开 Enter=input() Num=Enter.split(" ") #字符型转换成数字 a=float(Num[0]) b=float(Num[1]) n=int(Num[2]) c=1 #记录迭代次数 i=0 #精度 delta = 0.5 * 10 **(-n) #公式 def formular(temp): result=3600 / temp * ((1 + temp / 12) ** 240 - 1)-500000 return result #试值法 while abs(formular(c))>0.1**n: c=b-(formular(b)*(b-a))/(formular(b)-formular(a)) if abs(formular(c)) b-a): break elif formular(a)*formular(c)<0: b=c i=i+1 else: a=c i=i+1 #迭代次数 print(i) #利率结果 print(round(c,n)) 不动点迭代法

1.简介
设法把方程f(x)=0转化为:x=g(x),并构造迭代公式:pn+1=g(pn) ,其中n=0, 1,… 在有根区间[a, b]上取一点p0作为方程f(x)=0的初始近似根,代入上式,得到p1=g(p0),p2=g(p1), …, 从而得到序列{pn},如果序列的极限P存在,则P是函数g(x)的不动点,也是方程f(x)=0的根。

2.重点
①如何选取一个收敛的g(x)
②如何选取迭代初始点

3.结束迭代法的条件
p(n)-p(n-1)的绝对值小于一个预定的值(精度)

4.题目
【问题描述】在[a,b]区间内寻找方程x**5-2*x-1=0的根的初始近似值位置,确定不动点迭代的初始点(可能有多个),然后使用不动点迭代法求方程的根(可能有多个根)。前后两次迭代的差的绝对值小于delta后停止迭代。

【输入形式】在屏幕上输入3个数,依次为区间左端点值a、右端点值b和所求根的精度值。各数间都以一个空格分隔。根据输入的所求根的精度值可求得delta.

【输出形式】每一行输出一个根(精确到小数点后3位)

【样例1输入】

-1.2 1.5 3

【样例1输出】

-1.000

-0.519

1.291

【样例1说明】输入:左端点a值为-1.2,右端点b值为1.5,前后两次迭代的差的绝对值小于delta=10**(-3)后停止迭代。输出:从小到大顺序输出三个根的值。

【评分标准】根据输入得到的输出准确

import math #输入并用空格分开 Enter=input() Num=Enter.split(" ") #字符型转换成数字 a=float(Num[0]) b=float(Num[1]) deltaa=int(Num[2]) #精度 delta=10**(-deltaa) #迭代公式一 def pan(A): A=2*A+1 if A delta: p1=p2 p2=pan(p1) result1=p2 #获得第二个不动点 p1=(b-a)/8*3+a p2=duan(p1) while math.fabs(p2-p1)>delta: p1=p2 p2=duan(p1) result2=p2 #获得第三个不动点 p1=(b-a)/8*7.5+a p2=pan(p1) while math.fabs(p2-p1)>delta: p1=p2 p2=pan(p1) result3=p2 print('%.3f'%result1) print('%.3f'%result2) print('%.3f'%result3) #这个题不太行,必须将区间分成八等份,然后分别取区间的第0.5份,第3份和第7.5份才能和测试数据完全匹配,并且我也不知道为什么要这么分,就很奇怪。
作者:啊噗呲咔



迭代 非线性方程 迭代法 线性方程 非线性 方法 二分 线性 二分法

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章