我必须编写一个用于上课的程序,其中该程序使用上三角矩阵求解矩阵系统。该方法必须使用C语言编写并使用正向替换。然后针对未知的某些情况对功能进行测试,然后您会返回三个失败/成功的结果。对于成功,返回值为0,对于数字失败,返回值为1。但是,我无法让程序在他们期望的时候返回1。
我几乎在每个步骤上都尝试过测试nans或infs是否在使用中,如果使用nans或infs则返回1。此外,由于给定的右侧被覆盖,因此通过复制值来进行循环以查看结果是否给出了原始的右侧。我通过计算相对误差,针对给定的右侧测试了结果。

我的问题是。你们是否对如何进行其他测试和/或系统会产生数值不稳定有任何想法?

如果b是右手边,则alpha是添加到对角线的给定常数,R是系数矩阵。其中R加alpha对角线中的元素不为零。

编辑:
我编写的代码如下

#include <math.h>
#include <stdlib.h>
#include <string.h>

int fwsubst(unsigned long n,double alpha,double **R,double *b){
double *x = malloc(sizeof(double)*n);
double row, err = 0,t,tmp;

memcpy(x,b,sizeof(double)*n);

for (size_t k = 0; k < n; k++) {
tmp = (b[k]-summation(R,b,k))/(R[k][k]+alpha);
  if(tmp ==-NAN || tmp ==NAN || tmp ==INFINITY || tmp ==-INFINITY)
    return -1;
  b[k]=tmp;
}

for (size_t k = 0; k < n; k++) {
  row = 0;
  for (size_t i = 0; i < k; i++) {
    row += R[i][k] * b[i];
  }
  row += b[k]*(R[k][k]+alpha);
  if (row==NAN || row==INFINITY)
    return -1;

  if(x[k]==0)
    t = fabs(row);
  else
    t = fabs(1-row/x[k]);

  err += t;
}

if(err>1e-15 || err==-NAN || err==NAN || err==INFINITY || err==-INFINITY)
  return -1;

return 0;
}


和功能

double summation(double **R, double* b, size_t k){
double sum=0;
for (size_t i = 0; i < k; i++) {
  sum += R[i][k]*b[i];
}

return sum;
}

最佳答案

OP代码中的一个错误是直接将double值与NAN进行比较,例如

if(tmp ==-NAN || tmp ==NAN || tmp ==INFINITY || tmp ==-INFINITY)
    return -1;


同时,引用https://en.cppreference.com/w/c/numeric/math/isnan


  NaN值永远不会等于自己或其他NaN值。复制NaN可能会更改其位模式。测试浮点值是否为NaN的另一种方法是将其与自身进行比较:
  
  bool is_nan(double x) { return x != x; }


可以使用库函数isfinite()重写以前的测试:

if ( !isfinite(tmp) )
    return -1;

关于c - 数值稳定正向替代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52560928/

10-11 22:57