Fortran实现Newton迭代法求解非线性方程

版权申诉
0 下载量 116 浏览量 更新于2024-12-04 收藏 648KB RAR 举报
资源摘要信息:"本资源涉及的主题是使用Fortran语言实现Newton迭代法来求解非线性方程的程序包。Newton迭代法是一种迭代求解非线性方程的方法,它基于泰勒级数展开,通过不断的迭代来逼近方程的根。Fortran语言是一种用于科学计算的高级编程语言,它在数值计算领域有着广泛的应用,特别是在物理、工程和数学研究中。本资源的名称中的“newton-diedai.rar”指的是包含了Newton迭代法相关文件的压缩包,而“Newton diedai”表明该压缩包中的文件可能直接命名为Newton迭代法相关的内容。" 知识点详细说明: 1. Fortran语言 Fortran(公式翻译器)是一种高级编程语言,主要用于数学和科学计算,特别是涉及大规模数值计算的领域。Fortran语言以其计算效率高、执行速度快而著称。其设计目标是便于编写科学计算程序,因此它提供了丰富的数学函数库和数组操作功能。 2. Newton迭代法(牛顿法) 牛顿迭代法,又称牛顿-拉弗森方法,是一种用于求解非线性方程的迭代方法。该方法利用函数在根附近可近似为线性的性质,通过迭代计算逐渐逼近方程的根。基本原理是用函数f(x)的切线来代替函数本身,通过切点的横坐标不断更新逼近根的位置。 3. 非线性方程求解 非线性方程是指方程中未知数的最高次数大于1或者含有未知数的乘积、指数等项。这类方程通常不能像线性方程那样简单地解出解析解,因此常常需要借助数值方法求近似解。牛顿迭代法是求解非线性方程近似根的一种有效工具,尤其适用于求解具有单个根的方程。 4. Fortran在数值计算中的应用 由于Fortran语言强大的数值计算能力,它在科学和工程计算领域被广泛应用。Fortran提供了丰富的数学库和高效的数组处理能力,可以高效地执行矩阵运算、解线性方程组、求解优化问题、进行统计分析以及实现各种数值算法。使用Fortran进行编程时,通常需要利用循环结构来实现算法的迭代过程。 5. 文件压缩和打包 在本资源中,“newton-diedai.rar”表示了一个压缩包的文件名,而“Newton diedai”可能是该压缩包内文件的名称。RAR是一种流行的文件压缩格式,它可以有效减少文件的大小,便于存储和传输。在计算机科学中,文件压缩技术对于优化存储空间和提高数据传输效率至关重要。 6. 程序开发和调试 使用Fortran或其他编程语言开发算法程序,如Newton迭代法,通常包括算法设计、代码编写、编译、运行和调试等步骤。对于开发者而言,理解算法逻辑、掌握编程语言特性和调试技巧是编写高质量程序的基础。此外,针对特定问题的测试也是不可或缺的环节,以确保程序能够正确、高效地运行并给出准确的结果。 以上知识点涵盖了从Fortran编程语言到Newton迭代法求解非线性方程的基础和应用,以及与之相关的文件压缩与打包技术,旨在为解决科学和工程领域中的计算问题提供理论基础和实践指导。

import numpy as np from sklearn import datasets from sklearn.linear_model import LinearRegression np.random.seed(10) class Newton(object): def init(self,epochs=50): self.W = None self.epochs = epochs def get_loss(self, X, y, W,b): """ 计算损失 0.5sum(y_pred-y)^2 input: X(2 dim np.array):特征 y(1 dim np.array):标签 W(2 dim np.array):线性回归模型权重矩阵 output:损失函数值 """ #print(np.dot(X,W)) loss = 0.5np.sum((y - np.dot(X,W)-b)2) return loss def first_derivative(self,X,y): """ 计算一阶导数g = (y_pred - y)*x input: X(2 dim np.array):特征 y(1 dim np.array):标签 W(2 dim np.array):线性回归模型权重矩阵 output:损失函数值 """ y_pred = np.dot(X,self.W) + self.b g = np.dot(X.T, np.array(y_pred - y)) g_b = np.mean(y_pred-y) return g,g_b def second_derivative(self,X,y): """ 计算二阶导数 Hij = sum(X.T[i]X.T[j]) input: X(2 dim np.array):特征 y(1 dim np.array):标签 output:损失函数值 """ H = np.zeros(shape=(X.shape[1],X.shape[1])) H = np.dot(X.T, X) H_b = 1 return H, H_b def fit(self, X, y): """ 线性回归 y = WX + b拟合,牛顿法求解 input: X(2 dim np.array):特征 y(1 dim np.array):标签 output:拟合的线性回归 """ self.W = np.random.normal(size=(X.shape[1])) self.b = 0 for epoch in range(self.epochs): g,g_b = self.first_derivative(X,y) # 一阶导数 H,H_b = self.second_derivative(X,y) # 二阶导数 self.W = self.W - np.dot(np.linalg.pinv(H),g) self.b = self.b - 1/H_bg_b print("itration:{} ".format(epoch), "loss:{:.4f}".format( self.get_loss(X, y , self.W,self.b))) def predict(): """ 需要自己实现的代码 """ pass def normalize(x): return (x - np.min(x))/(np.max(x) - np.min(x)) if name == "main": np.random.seed(2) X = np.random.rand(100,5) y = np.sum(X3 + X**2,axis=1) print(X.shape, y.shape) # 归一化 X_norm = normalize(X) X_train = X_norm[:int(len(X_norm)*0.8)] X_test = X_norm[int(len(X_norm)*0.8):] y_train = y[:int(len(X_norm)0.8)] y_test = y[int(len(X_norm)0.8):] # 牛顿法求解回归问题 newton=Newton() newton.fit(X_train, y_train) y_pred = newton.predict(X_test,y_test) print(0.5np.sum((y_test - y_pred)**2)) reg = LinearRegression().fit(X_train, y_train) y_pred = reg.predict(X_test) print(0.5np.sum((y_test - y_pred)**2)) ——修改代码中的问题,并补全缺失的代码,实现牛顿最优化算法

2023-06-13 上传