我试图用Jacobi方法的两个 vector 找出tbe无限范数的相对误差,但我得到了一个意外的解决方案,但确切的值是24 /25。这是我的代码:

#include <iostream>
#include <math.h>

using namespace std;

double infinite_norm(double b[]) {
    double maximum;
    for(int i = 0; i < sizeof(b); i++) b[i] = fabs(b[i]);
    maximum = b[0];
    for(int i = 1; i < sizeof(b); i++) maximum = fmax(maximum, b[i]);
    return maximum;
}

double *subtract_vectors(double x[], double y[]) {
    for(int k = 0; k <= sizeof(x); k++) x[k] = x[k] - y[k];
    return x;
}

double relative_error(double x[], double y[]) {
    return infinite_norm(subtract_vectors(x, y)) / infinite_norm(x);
}
int main() {
    static double b[] = {6., 25., -11., 15.};
    static double c[] = {1., 1., 1., 1.};
   cout<<relative_error(b, c)<<endl;
   cout<<24. / 25. <<endl;

    return 0;
}

在relative_error中,函数可以很好地计算 infinite_norm(subtract_vectors(x,y)) infinite_norm(x),但不能计算除法。

最佳答案

double *subtract_vectors(double x[], double y[]) {
for(int k = 0; k <= sizeof(x); k++) x[k] = x[k] - y[k];
return x;

默认情况下,C++默认通过引用传递诸如x[]之类的数组,因此您对x[k]的赋值会更改该数组。调用subtract_vectors(x, y)之后,您每次调用x时都会调用减法版本。

在subtract_vectors中创建一个新数组,然后返回它。

编辑:也,使用 vector ,它不是c++ 11而是来自c++ 98的标准库:)

Edit2:sizeof(x)返回指针的大小,而不是数组的大小。通过使用std::vector可以轻松避免此错误,但是如果将其粘在纯数组上,则应将一个维传递给subtract_vectors:
double *subtract_vectors(double x[], double y[], int const dim) {

最终代码

由于绕过dim太烦人了,我实际上设置了一个全局变量(如果需要数组,则设置constexpr int dim = 4,如果需要实际的c++ 11之前的代码,则设置#define dim 4),但是我现在已经这样写了,所以您必须自己进行调整。另外,实际上,我实际上将尽可能使用vector或std::array
#include <iostream>
#include <math.h>

using namespace std;

double infinite_norm(double b[], int const dim) {
    double maximum;
    for(int i = 0; i < dim; i++) b[i] = fabs(b[i]);
    maximum = b[0];
    for(int i = 1; i < dim; i++) maximum = fmax(maximum, b[i]);
    return maximum;
}

double *subtract_vectors(double x[], double y[], int const dim) {
      double *result = new double[dim];
    for(int k = 0; k < dim; k++) result[k] = x[k] - y[k];
    return result;
}

double relative_error(double x[], double y[], int const dim) {
    return infinite_norm(subtract_vectors(x, y, dim), dim) / infinite_norm(x, dim);
}

int main() {
  int const dimension{4};
  static double b[] = {6., 25., -11., 15.};
  static double c[] = {1., 1., 1., 1.};
  cout<<relative_error(b, c, dimension)<<endl;
  cout<<24. / 25. <<endl;

  return 0;
}

关于c++ - 用C++中的无限范数找出相对误差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50494788/

10-12 02:14