武汉理工大学数值分析课内实验


前言

数值分析课内实验采用程序设计的思想去实现有关数值分析的计算思维,不仅加深了对课上知识的巩固,而且锻炼了自身的编程能力。

主要仪器设备及耗材

  1. PC机
  2. VS 2019开发环境

以下是本篇文章正文内容,下面案例可供参考

一、用C语言实现几个多项式插值的程序。(Lagrange插值、Newton插值)

实验内容描述

拉格朗日插值法,运用多个插值点求根号115的近似值。

实验基本原理与设计

在这里插入图片描述

分析与设计

#include<iostream>
using namespace std;
double lagrange(int n,double x[],double y[],double xx)
{
    
    
	double t;
	double yy = 0;
	for (int k = 0; k < n; k++)
	{
    
     
		t= 1;
		for (int j = 0; j <n ; j++)
		{
    
    
			if (j != k)
				t *= (xx - x[j]) / (x[k] - x[j]);
		}
		yy += t*y[k];
	}
	return yy;
}
void main()
{
    
    
	int n;
	double x[100], y[100];
	double xx, yy;
	cout << "Please enter n:";
	cin >> n;
	for (int i = 0; i < n; i++)
	{
    
    
		cout << "x"<<i<<":";
		cin >> x[i];
	}
	cout << endl;
	for (int i = 0; i < n; i++)
	{
    
    
		cout << "y" << i << ":";
		cin >> y[i];
	}
	cout << "Please enter xx:";
	cin >> xx;
	yy = lagrange(n, x, y, xx);
	cout << "Result is:" << yy << endl;}

实验结果

在这里插入图片描述

二、用C语言实现几个求常微分方程初值问题解的程序。(Euler方法及其改进、龙格-库塔(Runge-Kutta)方法)

实验内容描述

利用四阶龙格-库塔方法计算常微分方程初值f(x, y)=y-2*x/y , y(0)=1的问题。

实验基本原理与设计

在这里插入图片描述

分析与设计

#include<iostream>
using namespace std;
void RK()
{
    
    
	double h = 0.2;
	int n;
	double k1, k2, k3, k4;
	double x[100], y[100];
	x[0] = 0;
	y[0] = 1;
	cout << "请输入计算的次数n:(步长为0.2)";
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
    
    
		k1 = y[i - 1] - 2 * x[i - 1] / y[i - 1];
		k2 = (y[i - 1] + h / 2 * k1) - 2 * (x[i - 1] + h / 2) / (y[i - 1] + h / 2 * k1);
		k3=(y[i - 1] + h / 2 * k2)- 2 * (x[i - 1] + h / 2) / (y[i - 1] + h / 2 * k2);
		k4= (y[i - 1] + h * k3) - 2 * (x[i - 1] + h ) / (y[i - 1] + h  * k3);
		y[i] = y[i - 1] + h /6* (k1+2*k2+2*k3+k4);
		x[i] = x[i - 1] + h;
		cout << x[i] << "\t" << y[i] << endl;
	}
}
int main()
{
    
    
	RK();
	return 0;
}

实验结果

在这里插入图片描述

三、用C语言实现几个非线性方程求根的程序。(二分法、迭代法、迭代过程的加速)

实验内容描述

埃特金算法的实现(x=f(x),f(x)=sin(x)+0.5)。

实验基本原理与设计

在这里插入图片描述

分析与设计

#include<iostream>
#include<math.h>
using namespace std;
double f(double x)
{
    
    
	double f;
	f = sin(x) + 0.5;
	return f;
}
void aitejin()
{
    
    
	double x[100],xx[100],xxx[100];
	x[0] = 1.0;
	double t = 0;
	for (int i = 1; i < 100; i++) {
    
    
		xx[i] = f(x[i - 1]);
		xxx[i] = f(xx[i]);
		x[i] = xxx[i] - pow((xxx[i] - xx[i]), 2) / (xxx[i] - 2 * xx[i] + x[i - 1]);
		cout << "x" << i << ":" << "\t" << x[i] << endl;
		if (x[i] - x[i - 1] < pow(10, -6)) {
    
    
			t = x[i];
			break;
		}
	}
	cout << "近似根为" << t << endl;
}
int main() {
    
    
	aitejin();
	return 0;
}

实验结果

在这里插入图片描述

四、用C语言实现几个求线性方程组解的程序。(Gauss消去法)

实验内容描述

用高斯消去法计算10 - 5 x1 + x2 = 1 x1 + x2 = 2方程组问题。

实验基本原理与设计

在这里插入图片描述

分析与设计

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
bool gauss(int n, double a[][10])
{
    
    
	int k, i, j;
	for (k = 0; k < n - 1; k++)
	{
    
    
		// 判断是否非奇异矩阵
		if (a[k][k] == 0)
			return false;
		for (i = k + 1; i < n; i++)
		{
    
    
			// 直接用 a[i][k] 来存储下面的表达式的值
			a[i][k] = a[i][k] / a[k][k];
			for (j = k + 1; j < n + 1; j++)
				a[i][j] -= a[i][k] * a[k][j]; // 对第 i 行元素进行一次消元
		}
	}
	// 判断 Xn 是否为有唯一解,否则返回错误
	if (a[n - 1][n - 1] == 0)
		return false;
	// 回代求解
	for (k = n - 1; k >= 0; k--)
	{
    
    
		for (j = k + 1; j < n; j++)
			a[k][n] -= a[k][j] * a[j][n];
		a[k][n] /= a[k][k];
	}
	return true;
}
int main(){
    
    
	int i, j, n;
	double a[10][10];
	cout << " 请输入方程组的未知数的个数 n:" << endl;
	cin >> n;
	cout << " 请输入方程组的系数和和: " << endl;
	for (i = 0; i < n; i++)
	{
    
    
		for (j = 0; j <= n; j++)
			cin >> a[i][j];
	}
	if (gauss(n, a))
	{
    
    
		cout << " 方程组的解是: " << endl;
		for (i = 0; i < n; i++)
			cout << setw(5) << a[i][n] << " ";
		cout << endl;
	}
	else
	cout << " 方程不能用此方法解出 " << endl;
}

实验结果

在这里插入图片描述


总结

数值分析实验报告只要求写一种方法,但是我写了其他的方法,详情可参考以下链接
链接:冲冲冲~
提取码:1kvi
复制这段内容后打开百度网盘手机App,操作更方便哦

猜你喜欢

转载自blog.csdn.net/mo_zhe/article/details/112801842
今日推荐