- 写在前面的话
- 乘幂法
- 例题
- 代码
- 结果
- 二分法求对称三对角矩阵特征值
- 代码
- 结果
- 复化梯形
- 例题
- 代码
- 结果
考试结束,《数值计算方法》编程作业发出来给大家看看~
乘幂法 例题《数值计算方法》P185页例题6.4,误差设定到0.00001时需要10次迭代,所得到的结果与书上的结果接近。当把误差限定得更小则迭代的次数更多。
import numpy as np import matplotlib.pyplot as plt k = 0 e = 1 temp_max = [] z0 = np.mat([1, 1, 1]) z0 = z0.T A = np.mat([[2,0,1], [1,-1,2], [0,1,5]], dtype=float) while e > 0.00001: y = A * z0 y1 = y.copy() y1 = abs(y1) x = y1.argmax() z0 = y/y[x] print('迭代次数:',k,'y:',y.T,'m:',y[x],'z:',z0.T) print(' ') temp_max.append(y[x]) k = k + 1 if k > 1: e = abs(y[x] - temp_max[-2]) λ = y[x] print('最大特征值为:', λ) print('相应特征向量为:n', (A*z0))结果 二分法求对称三对角矩阵特征值 代码
import numpy as np import matplotlib.pyplot as plt data = [ [2, 2, 0, 0], [1, 1, 2, 0], [0, 2, 1, 2], [0, 0, 2, 1] ] def P0(x, data): return 1 def P1(x, data): return data[0][0] - x def P2(x, data): return (data[1][1] - x) * P1(x, data) - data[1][0] ** 2 * P0(x, data) def P3(x, data): return (data[2][2] - x) * P2(x, data) - data[2][1] ** 2 * P1(x, data) def P4(x, data): return (data[3][3] - x) * P3(x, data) - data[3][2] ** 2 * P2(x, data) def ifTong(a, b): if a > 0 and b > 0: return 1 elif a < 0 and b < 0: return 1 else: return 0 def P(x, PX, data): ret = [] count = 0 for i in range(PX): if i == 0: ret.append(1) elif i == 1: ret.append(data[i - 1][i - 1] - x) else: ret.append((data[i - 1][i - 1] - x) * ret[-1] - data[i - 1][i - 2] ** 2 * ret[-2]) for i in range(1, len(ret)): if ret[i] == 0: a = ret[i - 1] count += 1 if ret[i - 1] == 0: count += ifTong(ret[i], ret[i - 2]) else: count += ifTong(ret[i], ret[i - 1]) ret.append(count) return ret if __name__ == '__main__': # x1,x2,x3,x4,x5=P0(x,data),P1(x,data),P2(x,data),P3(x,data),P4(x,data) # print(x1,x2,x3,x4,x5) x = np.arange(-3, 5.5, 0.000025) ret = [] for i in x: ret.append(P(i, 5, data)) ret = np.transpose(ret) ret = np.insert(ret, 0, x, axis=0) print(ret) ans = [] for i in range(len(ret[0]) - 1): ans.append(ret[-1][i] - ret[-1][i + 1]) # print(ans) for i in range(len(ans)): if ans[i] != 0: print('有一个值在', ret[0][i], '和', ret[0][i + 1], '之间') pass结果 复化梯形 例题
《数值计算方法》P103页例题4.1中表4.3的结果和代码运行结果一致。
import math import numpy as np import matplotlib.pyplot as plt def f1(x): y= np.exp(x)*np.cos(x) return y def result(f,a,b,n): ti=0.0 h=(b-a)/n ti=f(a)+f(b) for k in range(1,int(n)): xk=a+k*h ti = ti + 2 * f(xk) result = ti*h/2 print("复化梯形公式计算结果为:", result) if __name__ == '__main__': n = 2 k = 10 for i in range(1,k): print("n= ", n) result(f1,0,math.pi,n) n = n*2结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)