基本的GMRES基于cpp实现

基本的GMRES基于cpp实现

理论部分和matlab版本可以查看我的其他文章:

  1. 基本理论
  2. 完整实现

以下为代码,头文件里面有cuda的东西。无视即可。

int main()
{
 //time start
 clock_t startTime = clock();
 //load
 FILE *fp;
 static double data[100];
 if (fp = fopen("data.bin", "rb"))
 {
  for (int i = 0; i<100; i++)
  {
   fread(&data[i], sizeof(double), 100, fp);
  }
 }
 //data
 double *A, *x0, *b;
 A = data;
 x0 = new double[10];
 b = new double[10];
 for (int i = 0; i < 10; i++)
 {
  x0[i] = 0;
  b[i] = 0;
 }
 x0[0] = 1;
 //GMRES
 double *y0, *r0, *beta;
 y0 = new double[10];
 r0 = new double[10];
 for (int i = 0; i < 10; i++)
 {
  y0[i] = 0;
  r0[i] = 0;
 }
 for (int i = 0; i < 10; i++)
 {
  for (int j = 0; j < 10; j++)
  {
   y0[i] += A[i * 10 + j] * x0[j];
  }
  r0[i] = b[i] - y0[i];
 }
 beta = new double[1];
 beta[0] = 0;
 double *v = new double[10];
 for (int i = 0; i < 10; i++)
 {
  v[i] = 0;
 }
 //V1,单位化
 double temp = 0;
 for (int j = 0; j < 10; j++)
 {
  temp = temp + r0[j] * r0[j];
 }
 beta[0] = sqrt(temp);
 for (int j = 0; j < 10; j++)
 {
  if (beta[0] == 0)
  {
   v[j] = 0;
  }
  else
  {
   v[j] = r0[j] / beta[0];
  }
 }
 //data
 double *omiga, *V, *H;
 omiga = new double[10];//vector
 for (int j = 0; j < 10; j++)
 {
  omiga[j] = 0;
 }
 V = new double[100];//matrix
 for (int j = 0; j < 100; j++)
 {
  V[j] = 0;
 }
 H = new double[110];//matrix
 for (int j = 0; j < 110; j++)
 {
  H[j] = 0;
 }
 //V(:,1) = v1
 for (int i = 0; i < 10; i++)
 {
  V[10 * i] = v[i];
 }
 //Do
 double resVec[10],resVal;
 for (int j = 0; j < 10; j++)
 {
  //Compute omiga(j) := A*v(j)
  for (int i = 0; i < 10; i++)
  {
   for (int k = 0; k < 10; k++)
   {
    omiga[i] += A[i * 10 + k] * V[k * 10 + j];
   }
  }
  //h(i,j) and res
  for (int i = 0; i <= j; i++)
  {
   //h(i,j)
   for (int k = 0; k < 10; k++)
   {
    H[i * 10 + j] += omiga[k] * V[10 * k + i];
   }
   //omiga(i,j)
   for (int k = 0; k < 10; k++)
   {
    omiga[k] = omiga[k] - H[i * 10 + j] * V[10 * k + i];
   }
  }
  //h(j+1,j)
  for (int i = 0; i < 10; i++)
  {
   H[10 * (j + 1) + j] += omiga[i] * omiga[i];
  }
  H[10 * (j + 1) + j] = sqrt(H[10 * (j + 1) + j]);
  //if
  if (H[10 * (j + 1) + j] < 1e-11)//10-10
  {
   break;
   printf("done , residual is %d\n", H[10 * (j + 1) + j]);
  }
  v(j+1)
  //for (int i = 0; i <10; i++)
  //{
  // v[i] = omiga[i] / H[10 * (j + 1) + j];
  //}
  //V(:,j+1)
  for (int i = 0; i <10; i++)
  {
   if (j < 9)
   {
    V[10 * i + (j + 1)] = omiga[i] / H[10 * (j + 1) + j];
   }
   else
   {
    resVec[i] = omiga[i];
   }
  }
 }
 //visualizion
 //data
 printf("data:\n");
 for (int i = 0; i < 10; i++)
 {
  for (int j = 0; j < 10; j++)
  {
   cout << data[10*i+j] << "  ";
  }
  cout << endl;
 }
 printf("\n");
 //A
 printf("A:\n");
 for (int i = 0; i < 10; i++)
 {
  for (int j = 0; j < 10; j++)
  {
   cout << A[10 * i + j] << "  ";
  }
  cout << endl;
 }
 printf("\n");
 //x0
 printf("x0:\n");
 for (int i = 0; i < 10; i++)
 {
  cout << x0[i] << "  ";
 }
 printf("\n");
 //b
 printf("b:\n");
 for (int i = 0; i < 10; i++)
 {
  cout << b[i] << "  ";
 }
 printf("\n");
 //test
 printf("v:\n");
 for (int i = 0; i < 10; i++)
 {
  cout << v[i] << "  ";
 }
 printf("\n");
 //V
 printf("V:\n");
 for (int i = 0; i < 10; i++)
 {
  for (int j = 0; j < 10; j++)
  {
   cout << V[10 * i + j] << "         ";
  }
  cout << endl;
  cout << "next row" << endl;
 }
 printf("\n");
 //H
 printf("H:\n");
 for (int i = 0; i < 11; i++)
 {
  for (int j = 0; j < 10; j++)
  {
   cout << H[10 * i + j] << "    ";
  }
  cout << endl;
  cout << "next row" << endl;
 }
 printf("\n");
 //res vector
 printf("res vector:\n");
 for (int i = 0; i < 10; i++)
 {
  cout << resVec[i] << "  ";
 }
 printf("\n");
 //res Val
 resVal = 0;
 for (int i = 0; i < 10; i++)
 {
  resVal += resVec[i] * resVec[i];
 }
 cout << "残差值为"<<sqrt(resVal) <<endl;;
 //window
 clock_t endTime = clock();
 cout << "整个程序用时:" << double(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
 system("PAUSE");
 return 0;
}

其中data是10*10的一个矩阵,然后new出来的空间都没有delete掉,用的时候可以注意一下

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
顺序表是一种常见的数据结构,它的基本操作有初始化、获取元素、插入元素、删除元素和查找元素。在C++中,可以使用数组来实现顺序表。 首先,我们需要定义一个顺序表的结构体,其中包含数组和长度变量。 ```cpp const int MAX_SIZE = 100; // 假设顺序表的最大容量为100 struct ArrayList { int data[MAX_SIZE]; // 用于存储元素的数组 int length; // 当前元素个数 }; ``` 接下来是初始化操作,该操作可以将顺序表的长度设置为0。 ```cpp void init(ArrayList& list) { list.length = 0; } ``` 然后是获取元素的操作,我们需要传入顺序表和待获取元素的索引,返回对应索引位置的元素。 ```cpp int get(ArrayList list, int index) { if (index < 0 || index >= list.length) { // 索引越界,返回一个非法值 return -1; } return list.data[index]; } ``` 插入元素的操作需要传入顺序表、待插入的元素和插入位置的索引。该操作会在指定位置插入元素,并将原来位置及之后的元素向后移动一位。 ```cpp void insert(ArrayList& list, int element, int index) { if (index < 0 || index > list.length || list.length >= MAX_SIZE) { // 索引越界或顺序表已满,插入失败 return; } // 后移元素 for (int i = list.length - 1; i >= index; i--) { list.data[i + 1] = list.data[i]; } // 在指定位置插入元素 list.data[index] = element; list.length++; } ``` 删除元素的操作需要传入顺序表和待删除元素的索引。该操作会将指定位置的元素删除,并将之后的元素向前移动一位。 ```cpp void remove(ArrayList& list, int index) { if (index < 0 || index >= list.length) { // 索引越界,删除失败 return; } // 前移元素 for (int i = index + 1; i < list.length; i++) { list.data[i - 1] = list.data[i]; } list.length--; } ``` 最后是查找元素的操作,该操作需要传入顺序表和待查找的元素值,返回元素在顺序表中的索引。 ```cpp int find(ArrayList list, int element) { for (int i = 0; i < list.length; i++) { if (list.data[i] == element) { return i; } } return -1; // 未找到元素 } ``` 这些基本操作的实现可以帮助我们对顺序表进行各种操作,包括初始化、获取元素、插入元素、删除元素和查找元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值