【计算方法】非线性方程和优化
0.WARNINGS
? ? 本文章主要適用于計算方法代碼的實現參考,由于本人是python究極小白,為了實驗課速成了一些內容,因此會包含較多的暴力解法orz,如有代碼錯誤、可優化的地方歡迎各位大佬指出,感激不盡。
? ? 此外,本人制作本文的目的,主要是懶的將代碼保存在本地中,且博客方便個人的復習。
? ??非線性方程和優化主要包含的內容有:二分法;普通迭代法;牛頓迭代法;弦截法(單點&兩點);
1.
用二分法求方程 xlnx = 1 在[0.5 , 4] 的近似根,使函數值誤差不超過0.001,或有根區間長度不超過0.001。輸出保留3位小數。
import matha=0.5 b=4def f(x):return x*math.log(x)-1while 1:mid=a / 2 + b / 2if math.fabs(f(mid)) < 0.001 or math.fabs(a - b) < 0.001:ret = midbreakelse:if f(mid)*f(a)<=0:b=midelse:a=midprint("%.3f" % ret)2.
用迭代法求方程 x= e –x在x=0.5附近的一個根,結果的精度要求0.00001。輸出保留4位小數
import mathdef f(x):return math.e**(-x)x=0.5while 1:temp=xx=f(x)if math.fabs(temp-x)<0.00001:breakprint("%.4f" % x)3.
用迭代法求函數f(x)=x-lnx-2在區間(2,+∞)內的零點,誤差是0.00001,最高迭代次數是500次。輸出保留三位小數。
import mathdef f(x):return math.log(x)+2x=2 cnt=0 while cnt<=500:temp=xx=f(x)if math.fabs(temp-x)<0.00001:breakelse:cnt += 1print("%.3f" % x)4.
用迭代法求方程3 x2- e x=0在[3,4]區間的一個根,結果的精度要求0.0001。輸出保留3位小數
import mathdef f(x):return math.log(3*x**2)x=3.5 while x>=3 and x<=4:temp=xx=f(x)if math.fabs(temp-x)<0.00001:breakprint("%.3f" % x)5.
輸出x^3-x^2-1=0的有根區間,并在該有根區間內通過二分法找到其具有4位有效數字的根。
注意:有根區間的長度為0.1,輸出到小數點后1位。
例如:
輸出:
3.5(有根區間左端點)
3.6(有根區間右端點)
3.578(根)
(此非該題的正確解,只是示例)
import mathdef f(x):return pow(x,3)-pow(x,2)-1# 容易發現f(1)<0 and f(2)>0 i=1 while i<2:i+=0.1if f(i)>0:b=ia=i-0.1break print("%.1f" % a) # (有根區間左端點) print("%.1f" % b) # (有根區間右端點)while 1:mid=a/2+b/2if math.fabs(f(mid))<0.001 or math.fabs(a-b)<0.001:ret=midbreakelse:if f(mid)*f(a)<=0:b=midelse:a=mid print("%.3f" % ret) # (根)6.
設函數f(x)=sinx-(x/2)2,牛頓法求函數的根。初始值是2.0,誤差是0.0001,最高迭代次數是500次。輸出保留三位小數。
import math# 設函數f(x)=sinx-(x/2)2,牛頓法求函數的根。 # 初始值是2.0,誤差是0.0001,最高迭代次數是500次。輸出保留三位小數。def f(x):return math.sin(x)-(x/2)**2def f1(x):return math.cos(x)-x/2def fai(x):return x-f(x)/f1(x)cnt=0 e=0.0001 myx=2.0 while cnt<500:temp=fai(myx)if math.fabs(temp-myx)<e:myx=tempbreakelse:myx=tempprint("%.3f" % myx)7.
用牛頓迭代法求解x2=A的根,要求誤差小于0.00001
輸入:A
輸出:迭代序列值 迭代次數(從初值x0=A開始迭代)迭代值保留5位有效數字
例如:
輸入: 7
輸出: 4.00000 1
2.87500 2
2.65489 3
2.64577 4
2.64575 5
2.64575 6
import math# 用牛頓迭代法求解x2=A的根,要求誤差小于0.00001A=float(input())def fai(x,A):return x-(x**2-A)/(2*x)e=0.00001 myx=A cnt=int(0) while 1:temp=fai(myx,A)if math.fabs(temp-myx)<e:myx=tempcnt+=1breakelse:myx=tempcnt+=1print("%.5f %d" % (myx, cnt))print("%.5f %d" % (myx,cnt))8.
對非零實數a,采用牛頓迭代法設計一個不用除法運算求解1/a的計算程序。誤差小于10-5 ? 初值x0=0.01
輸入:a
輸出:迭代序列 (保留5位小數) 迭代次數
例如:
輸入:7
輸出:
0.01930 1
0.03599 2
0.06292 3
0.09812 4
0.12885 5
0.14148 6
0.14284 7
0.14286 8
0.14286 9
9.
在重根數未知情況下,求解非線性方程f(x)=e^(2x)-1-2x-2x^2的誤差小于0.0001的根。
輸入迭代初始值,輸出每次的近似解和迭代次數(空格分隔),近似解保留小數點后5。
例如:
輸入:2
輸出:
-2.47756 1
-0.26450 2
-0.00996 3
-0.00002 4
0.00000 5
10.
單點弦截法求f(x)=x-sinx-1在[1,2]區間解,誤差為0.0001
? ? ? ? ? ?輸入格式:
? ? ? ? ? ? ? ? ? ? ? a的值 ?b的值 ?(a為定點)
? ? ? ? ? ?輸出格式:
? ? ? ? ? ? ? ? ? ? ?根(保留4位小數)迭代次數
? ? ? ? ? ? ? ? ? ? ? 輸入:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1 2
? ? ? ? ? ? ? ? ? ? ? 輸出:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1.9346 12
import mathinp = input().split(' ') a = float(inp[0]) b = float(inp[1])e=0.0001 cnt=int(1)def f(x):return x-math.sin(x)-1def fai(x,x0):return x-f(x)/(f(x)-f(x0))*(x-x0) # x0=awhile 1:if math.fabs(b-fai(b,a))<e:b+=ebreakelse:b=fai(b,a)cnt+=1print("%.4f %d" % (b,cnt))11.
用雙點弦法求方程 xex-1=0 在x=0.5附近的根。初始兩點分別是0.3, 0.8, 最高迭代次數是500次,誤差是0.0001。輸出后值,并保留三位小數。
import math # 用雙點弦法求方程 xex-1=0 在x=0.5附近的根。初始兩點分別是0.3, 0.8, # 最高迭代次數是500次,誤差是0.0001。輸出后值,并保留三位小數。def f(x):return x*math.e**x-1def fai(xk,x):return xk-f(xk)/(f(xk)-f(x))*(xk-x) # xk=b,x=ae=0.0001 a=0.3 b=0.8 cnt=1 myx=0while cnt<=500:if math.fabs(fai(b,a)-myx)<e:myx = fai(b, a)# output the latter one?breakelse:myx=fai(b,a)a=bb=myxcnt+=1print("%.3f" % myx)12.
對于f(x)=x3-3x-1用三種方法求解。輸入兩個初值,x0和x1,其中xo作為牛頓法的初值進行迭代求解,x0為單點弦截的不動點和x1作為初值迭代求解,x0和x1作為雙點弦截的不動點迭代求解,誤差小于0.00001。輸出迭代值和迭代次數,迭代值保留5位有小數。
例如:
輸入:
1.5 3
輸出:
2.06667 1 (牛頓迭代結果)
1.90088 2
1.87972 3
1.87939 4
1.87939 5
1.66667 1(單點弦截迭代結果)
1.96933 2
1.84938 3
1.89032 4
1.87552 5
1.88077 6
1.87889 7
1.87956 8
1.87932 9
1.87941 10
1.87938 11
1.87939 12
1.87938 13
1.66667 1(雙點弦截迭代結果)
1.76613 2
1.90130 3
1.87744 4
1.87935 5
1.87939 6
1.87939 7
總結
以上是生活随笔為你收集整理的【计算方法】非线性方程和优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 想象未来人工智能的发展,人工智能构建未来
- 下一篇: 模仿苹果虚拟悬浮按钮(自动靠边、可浮现任