我试图用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/