2023 BUCT 计算方法实验报告

前言

Textlive版本:2023

textstudio版本:4.6.3

名字和日期在以下地方修改:

2023 BUCT 计算方法实验报告_第1张图片

图片下载地址;

figures.zip · LiangCha_Xyy/Source - Gitee.com

如下图,.tex文件和figures文件夹放在同一路径下即可

 .tex代码

\documentclass[UTF8]{ctexart}
\usepackage{listings}
\usepackage{xcolor} 
\usepackage{booktabs} %绘制表格
\usepackage{caption2} %标题居中
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{subfigure} 
\usepackage{longtable}
\usepackage{float}
\usepackage{graphicx}
\usepackage{booktabs}
\usepackage{indentfirst} 
\usepackage{setspace}
\usepackage{adjustbox}

\graphicspath{{figures/}}
\geometry{a4paper,left=2.5cm,right=2.5cm,top=2.5cm,bottom=2.5cm}
\setlength{\parindent}{0em} 
\lstset{
	numbers=left, %设置行号位置
	numberstyle=\tiny, %设置行号大小
	keywordstyle=\color{blue}, %设置关键字颜色
	commentstyle=\color[cmyk]{1,0,1,0}, %设置注释颜色
	escapeinside=``, %逃逸字符(1左面的键),用于显示中文
	%breaklines, %自动折行
	extendedchars=false, %解决代码跨页时,章节标题,页眉等汉字不显示的问题
	xleftmargin=1em,xrightmargin=1em, aboveskip=1em, %设置边距
	tabsize=4, %设置tab空格数
	showspaces=false %不显示空格
}
\title{	}
\author{自己的名字}
\renewcommand{\thesubsection}{\thesection.\arabic{subsection}}

\begin{document}
	
\begin{titlepage}
	\centering
	\vspace*{4cm} % 调整标题与图片的垂直间距
	\includegraphics[scale=0.08]{logo.png} \\
	{\Huge Beijing University of Chemical Technology\\} % 使用 \Huge 调整字体大小
	{\Huge Computing Methods\\ } 
	
	\rule{15cm}{1.2pt}
	{\Huge\bfseries 计算方法课程实验\\}
	\rule{15cm}{1.2pt} \\[2cm] % 调整标题与作者信息之间的垂直间距
	
	{\Large 名字\\[1cm]} % 调整作者信息的垂直间距
	{\Large 日期\\}
\end{titlepage}
%实验二
\section{Lagrange插值方法}
	\subsection{实验目的}
		(1)熟悉简单的一阶和二阶 Lagrange插值方法;\\
		(2)学会计算 Lagrange基函数;\\
		(3)正确构造插值多项式;\\
		(4)对插值结果进行合理分析;\\
	
	\subsection{实验原理}
		$p_n(x)=\sum_{k=0}^n y_k l_k(x)=\sum_{k=0}^n\left(\prod_{\substack{j=0 \\ j \neq k}}^n \frac{x-x_j}{x_k-x_j}\right) y_k$ \\
	
	\subsection{实验环境}
		Windows 10 + Visual Studio\\
	
	\subsection{实验内容}
		\setstretch{1.5}
		\centering
		\begin{tabular}{|l|l|}
			\hline$x$ & $f(x)$ \\
			\hline 24 & 1.888175 \\
			26 & 1.918645 \\
			28 & 1.947294 \\
			30 & 1.961009 \\
			\hline
		\end{tabular} \\
		
		表 1.1: 数据样本表\\
		\vspace{0.5cm} % 插入垂直空白
		使用 Lagrange插值多项式计算 f(25),f(27),f(29),并给出插值多项式。\\
		修改程序直至运行成功,查看运行结果,并和如下真实值进行比较。\\ 
		\vspace{0.5cm} % 插入垂直空白
		\begin{tabular}{|l|l|}
			\hline$x$ & $f(x)$ \\
			\hline 
			25 & 1.90365393871587 \\
			27 & 1.933182044931763 \\
			29 & 1.961009057454548 \\
			\hline
		\end{tabular} \\
		表 1.2: 数据真实值\\
		\raggedright %左对齐
		\vspace{5cm} 
	\subsection{程序代码}
		\begin{lstlisting}[language=C++,basicstyle=\small]
#include
#include
using namespace std;
int main()
{   
	//输入程序
	int m;
	cout<<"请输入有几个采样点:"<>m;
	pair points[m];
	for(int i=0;i>x>>y;
		points[i] = {x,y};
		cout<>n;
	for(int i=0;i>x_pred;
		double res = 0;
		for(int j=0;j
#include
using namespace std;
const int N = 4;//插值点数-1
pairpoints[]={{0.4,0.41075},{0.55,0.57815},
{0.65,0.69675},{0.8,0.88811},{0.9,1.02652}};
//差商计算 + 数据点更新
void func(int n)
{
	double f[n];//差商表
	for(int k=1;k<=n;k++){
		f[0] = points[k].second;
		for(int i=0;i=0;i--){
		b = b*(x-points[i].first)+points[i].second;
		cout<>a>>b;
	cout<<"请输入积分节点数:";
	cin>>n;
	double h = (b-a)/(n-1);
	double f[n],x[n];
	for(int i=0;i
#include
using namespace std;
double f(double x)//原函数
{
	return x*exp(x)-1;
}
double df(double x)//导函数
{
	return exp(x) + x*exp(x);
}
int main()
{
	double x;
	double eplison;
	cout<<"请输入精度要求:"<>eplison;
	cout<<"请输入迭代初值:"<>x;
	double x0 = x;
	double x1 = x0 - f(x0)/df(x0);
	while(fabs(x1-x0)>eplison){
		double temp = x1;
		x1 = x0 - f(x0)/df(x0);
		x0 = temp;
	}
	cout<<"f(x)=0的根x="<
using namespace std;
void input(int n, double b[], double **coefficient){
	cout<<"请输入系数矩阵:"<>coefficient[i][j];
	}
	cout<<"请输入常数矩阵:";
	for(int i=0;i>b[i];
}
int main()
{
	int n;
	double epsilon;
	cout << "请输入未知数个数:";
	cin >> n;
	double b[n];
	double x0[n];
	double x1[n];
	double **coefficient = new double*[n];
	for (int i = 0; i < n; i++) {
		coefficient[i] = new double[n];
	}
	input(n, b, coefficient);
	cout<<"请输入迭代初值:";
	for(int i=0;i>x0[i];
	cout<<"请输入精度要求:";
	cin>>epsilon;
	while(true){
		for(int i=0;i
using namespace std;
void input(int n, double b[], double **a){
	cout<<"请输入增广矩阵:"<>a[i][j];
		cin>>b[i];
	}
	
}
int main()
{
	int n;
	cout << "请输入未知数个数:";
	cin >> n;
	double b[n+1];
	double **a = new double*[n+1];
	for (int i = 0; i <=n; i++) {
		a[i] = new double[n+1];
	}
	input(n,b,a);
	for(int k=1;k<=n;k++){
		for(int j=k+1;j<=n;j++)
		a[k][j]/=a[k][k];//计算行乘子
		b[k]/=a[k][k];
		for(int i=k+1;i<=n;i++){
			for(int j=k+1;j<=n;j++){
				a[i][j]-=a[i][k]*a[k][j];
			}
		}
		for(int i=k+1;i<=n;i++) b[i]-=a[i][k]*b[k];
	}
	for(int i=n-1;i>=1;i--){
		double temp = 0;
		for(int j=i+1;j<=n;j++) temp+=a[i][j]*b[j];
		b[i] -= temp;
	}
	cout<<"解为:";
	for(int i=1;i<=n;i++) printf("%.4lf  ",b[i]);
	for (int i =0;i<=n; i++) {
		delete[] a[i];
	}
	delete[] a;
	return 0;
}
	\end{lstlisting}
	运行结果如下:\\
	\includegraphics[scale=1]{output6.png} \\
	
\section{线性方程组的矩阵分解法}
	\subsection{实验目的}
	(1) 掌握采用矩阵 LU 分解方法来求解线性方程组;\\
	(2) 编程实现矩阵 LU 分解算法;
	\subsection{实验原理}
	矩阵的 LU 分解定理:\\
	设A为n阶方阵,如果A的顺序主子矩阵 $A_1, A_2, · · · , A_{n-1}$均非奇异,则A可分解为一个单位下三角矩阵L和一个上三角矩阵U的乘积,即A = LU,且这种分解是唯一的。\\
	其中 L 和 U 的计算公式为:\\
	$$
	\left\{\begin{array}{l}
		u_{1 j}=a_{1 j}, \quad j=1,2,3, \cdots, n \\
		l_{i 1}=\frac{a_{i 1}}{u_{11}}, \quad i=2,3,4, \cdots, n \\
		u_{i j}=a_{i j}-\sum_{k=1}^{i-1} l_{i k} u_{k j}, \quad j=i, i+1, \cdots, n \\
		l_{i j}=\frac{a_{i j}-\sum_{k=1}^{j-1} l_{k k} u_{k j}}{u_{j j}}, \quad j=1,2, \cdots, i-1
	\end{array}\right.
	$$
	\subsection{实验环境}
	Windows 10 + Visual Studio\\
	
	\subsection{实验内容}
	(1) 写出矩阵 LU 分解法解线性方程组算法,编一程序上机调试出结果,要求所编程序适用于任何一解线性方程组问题,即能解决这一类问题,而不是某一个问题。\\
	(2) 使用矩阵 Doolittle 分解法求解下列方程组:\\
	$$
	\left\{\begin{array}{l}
		10 x_1-x_2-2 x_3=7.2 \\
		-x_1+10 x_2-2 x_3=8.3 \\
		-x_1-x_2+5 x_3=4.2
	\end{array}\right.
	$$
	\subsection{程序代码}
	\begin{lstlisting}[language=C++,basicstyle=\small]
#include 
using namespace std;
void input(int n, double b[], double **a){
	cout<<"请输入增广矩阵:"<>a[i][j];
		cin>>b[i];
	}
	
}
int main()
{
	int n;
	cout << "请输入未知数个数:";
	cin >> n;
	double b[n+1];
	double **a = new double*[n+1];
	for (int i = 0; i <=n; i++) {
		a[i] = new double[n+1];
	}
	double l[n+1][n+1],u[n+1][n+1];
	double x[n+1],y[n+1];
	input(n,b,a);
	for(int i=0;i=0;i--){
		x[i] = y[i];
		for(int j=i+1;j
using namespace std;
double f(double x,double y){
	return 3*x-2*y*y-1;
}
int main()
{
	const double h = 0.25;
	double x = 0;
	double y = 2;
	int idx = 0;
	while(x<=5){
		idx++;
		cout<<"第"<
using namespace std;
double f(double x,double y){
	return 3*x-2*y*y-1;
}
int main()
{
	const double h = 0.25;
	double x = 0;
	double y = 2;
	double _y;
	int idx = 0;
	while(x<=5){
		idx++;
		cout<<"第"<

你可能感兴趣的:(模板)