• 大小: 7KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2021-08-06
  • 语言: C/C++
  • 标签: 大作业  

资源简介

北航数值分析课后的大作业,程序输出正确。可以直接使用。

资源截图

代码片段和文件信息

// homework1.cpp : 定义控制台应用程序的入口点。
//

#include “stdafx.h“


int _tmain(int argc _TCHAR* argv[])
{
return 0;
}

#include
#include
#include
#include

#define ER 1e-12 //迭代精度水平
#define N 5   //矩阵的行数
#define M 501  //矩阵的列数


//A用于幂法和反幂法的计算,A0用于存储原始矩阵A的数据其值一直不变,LU用于存储Doolittle分解后的LU阵
double A[N][M] = { 0 0 } A0[N][M] = {00} LU[N][M] = { 0 0 };

//函数声明
void dooLittleFJ();   //将矩阵A进行doolittle分解,分解的矩阵存于LU中
void dooLittleQJ(double *b double *x);  //从已经分解完成的LU矩阵中求解X
int aPowerMethod(double u[] int &d double &r1);  //反幂法,其中u[]为初始迭代向量,d记录迭代次数,r1记录最终求得的特征值。
                                                   //返回1则在规定最大迭代次数内迭代完成,返回-1则超过最大迭代次数,求解失败
int powerMethon(double u[] int &d double &r1);    //幂法,参数含义返回值含义与反幂法相同
void init();  //初始化矩阵的值
void taolun();//输入不同的初始向量进行讨论分析的函数

void dooLittleFJ()
{
int tempEtempBs=N/2;
for (int k = 0; k < M; k++)
{
if (k + s >= M)
tempE = M-1;
else
tempE = k + s;

for (int i = k; i <=tempE; i++)
{
LU[k-i+s][i] = A[k-i+s][i];
if (i - s <= 0)
tempB = 0;
else
tempB = i - s;
for (int t = tempB; t <= k - 1; t++)
{
LU[k-i+s][i] -= LU[k-t+s][t] * LU[t-i+s][i];
}
}
for (int j = k + 1; j <=tempE; j++)
{
if (j - s <= 0)
tempB = 0;
else
tempB = j - s;
LU[j-k+s][k] = A[j-k+s][k];
for (int t = tempB; t <= k - 1; t++)
{
LU[j-k+s][k] -= LU[j-t+s][t] * LU[t-k+s][k];
}
LU[j-k+s][k] /= LU[s][k];
}
}

}

void dooLittleQJ(double *b double *x)
{
double *y = new double[M];
int s = N / 2tempBtempE;
for (int i = 0; i < M; i++)
{
y[i] = b[i];
if (i - s <= 0)
tempB = 0;
else
tempB = i - s;
for (int t = tempB; t <= i - 1; t++)
{
y[i] -= LU[i - t + s][t] * y[t];
}
}
for (int i = M - 1; i >= 0; i--)
{
x[i] = y[i];
if (i + s >= M)
tempE = M - 1;
else
tempE = i + s;
for (int t = i + 1; t <=tempE; t++)
{
x[i] -= LU[i - t + s][t] * x[t];
}
x[i] /= LU[s][i];
}
}

int aPowerMethod(double u[]int &ddouble &r1)
{
double  *y = new double[M];
double h r0 = 0;
int maxD=12000; //最大迭代次数,超过次次数视为失败
r1= d = 0;
dooLittleFJ();
while (maxD)
{
d++;
maxD--;
h = 0;
for (int i = 0; i < M; i++)
{
h += u[i] * u[i];
}
h = pow(h 0.5);
for (int i = 0; i < M; i++)
{
y[i] = u[i] / h;
}
dooLittleQJ(yu);
r1 = 0;
for (int i = 0; i < M; i++)
{
r1 += u[i] * y[i];
}
if (fabs(r1 - r0) / fabs(r1) <= ER)
{
r1 = 1 / r1;
return 1;
}
r0 = r1;
}
return -1;
}


int powerMethon(double u[]int &ddouble &r1)
{
double  *y = new double[M];
double h r0 = 0;
int tempBtempEmaxD=12000; 
r1 =d = 0;

while (maxD)
{
d++;
maxD--;
h = 0;
for (int i = 0; i < M; i++)
{
h += u[i] * u[i];
}
h = pow(h 0.5);
for (int i = 0; i < M; i++)
{
y[i] = u[i] / h;
}
r1 = 0;

评论

共有 条评论