为什么数值解与C语言中的解析解相同?
我已经编写了一个一维cfd问题,但我的数值解与解析解相同(最多保留6位小数) 我使用TDMA方法进行数值求解,对于解析解,我直接替换函数T(x)中的x值 解析解T(x)为为什么数值解与C语言中的解析解相同?,c,floating-point,numerical-methods,C,Floating Point,Numerical Methods,我已经编写了一个一维cfd问题,但我的数值解与解析解相同(最多保留6位小数) 我使用TDMA方法进行数值求解,对于解析解,我直接替换函数T(x)中的x值 解析解T(x)为T(x)=-(x^2)/2+11/21(x) 例如。4个网格点 x0 = 0.000000, x1 = 0.333333 , x2 = 0.666666 , x3 = 0.999999 . T(x0) = 0.000000 , T(x1) = 0.119048 , T(x2) = 0.126984 ,
T(x)=-(x^2)/2+11/21(x)代码>
例如。4个网格点
x0 = 0.000000, x1 = 0.333333 , x2 = 0.666666 , x3 = 0.999999 .
T(x0) = 0.000000 , T(x1) = 0.119048 , T(x2) = 0.126984 , T(x3) = 0.023810.
对于数值解,我使用了TDMA技术,请参考下面的代码
输入n=4作为结果
#include<stdio.h>
void temp_matrix(int n, double *a, double *b, double *c, double *d, double *T);
int main() {
int Bi = 20.0;
int n;
printf("%s ", "Enter the Number of total Grid Points");
scanf("%d", &n);
float t = (n - 1);
double dx = 1.0 / t;
int i;
printf("\n");
double q; // analytical solution below
double z[n];
for (i = 0; i <= n - 1; i++) {
q = (dx) * i;
z[i] = -(q * q) / 2 + q * (11.0 / 21);
printf("\nT analytical %lf ", z[i]);
}
double b[n - 1];
b[n - 2] = -2.0 * Bi * dx - 2.0;
for (i = 0; i <= n - 3; i++) {
b[i] = -2.0;
}
double a[n - 1];
a[n - 2] = 2.0;
a[0] = 0;
for (i = 1; i < n - 2; i++) {
a[i] = 1.0;
}
double c[n - 1];
for (i = 0; i <= n - 2; i++) {
c[i] = 1.0;
}
double d[n - 1];
for (i = 0; i <= n - 2; i++) {
d[i] = -(dx * dx);
}
double T[n];
temp_matrix(n, a, b, c, d, T);
return 0;
}
void temp_matrix(int n, double *a, double *b, double *c, double *d, double *T) {
int i;
double beta[n - 1];
double gama[n - 1];
beta[0] = b[0];
gama[0] = d[0] / beta[0];
for (i = 1; i <= n - 2; i++) {
beta[i] = b[i] - a[i] * (c[i - 1] / beta[i - 1]);
gama[i] = (d[i] - a[i] * gama[i - 1]) / beta[i];
}
int loop;
for (loop = 0; loop < n - 1; loop++)
for (loop = 0; loop < n - 1; loop++)
T[0] = 0;
T[n - 1] = gama[n - 2];
for (i = n - 2; i >= 1; i--) {
T[i] = gama[i - 1] - (c[i - 1] * (T[i + 1])) / beta[i - 1];
}
printf("\n");
for (i = 0; i < n; i++) {
printf("\nT numerical %lf", T[i]);
}
}
#包括
无效温度矩阵(int n,double*a,double*b,double*c,double*d,double*T);
int main(){
int-Bi=20.0;
int n;
printf(“%s”,“输入总网格点数”);
scanf(“%d”和“&n”);
浮点数t=(n-1);
双dx=1.0/t;
int i;
printf(“\n”);
双q;//下面的解析解
双z[n];
对于(i=0;i
为什么数值解与C语言中的解析解相同
它们相差约3位
以足够的精度打印以查看差异
#include<float.h>
printf("T analytical %.*e\t%a\n", DBL_DECIMAL_DIG - 1, z[i], z[i]);
printf("T numerical %.*e\t%a\n", DBL_DECIMAL_DIG - 1, T[i], T[i]);
使用下面的公式,我们可以看到x620的有效位的最后一个六位数与T[3]
的x619的有效位的差异。这只是1015差异中的一部分
#include<float.h>
printf("T analytical %.*e\t%a\n", DBL_DECIMAL_DIG - 1, z[i], z[i]);
printf("T numerical %.*e\t%a\n", DBL_DECIMAL_DIG - 1, T[i], T[i]);
输出
T analytical 0.0000000000000000e+00 0x0p+0
T analytical 1.1904761904761907e-01 0x1.e79e79e79e7ap-4
T analytical 1.2698412698412700e-01 0x1.0410410410411p-3
T analytical 2.3809523809523836e-02 0x1.861861861862p-6
T numerical 0.0000000000000000e+00 0x0p+0
T numerical 1.1904761904761904e-01 0x1.e79e79e79e79ep-4
T numerical 1.2698412698412698e-01 0x1.041041041041p-3
T numerical 2.3809523809523812e-02 0x1.8618618618619p-6
FLT_EVAL_METHOD 0
为什么数值解与C语言中的解析解相同
它们相差约3位
以足够的精度打印以查看差异
#include<float.h>
printf("T analytical %.*e\t%a\n", DBL_DECIMAL_DIG - 1, z[i], z[i]);
printf("T numerical %.*e\t%a\n", DBL_DECIMAL_DIG - 1, T[i], T[i]);
使用下面的公式,我们可以看到x620的有效位的最后一个六位数与T[3]
的x619的有效位的差异。这只是1015差异中的一部分
#include<float.h>
printf("T analytical %.*e\t%a\n", DBL_DECIMAL_DIG - 1, z[i], z[i]);
printf("T numerical %.*e\t%a\n", DBL_DECIMAL_DIG - 1, T[i], T[i]);
输出
T analytical 0.0000000000000000e+00 0x0p+0
T analytical 1.1904761904761907e-01 0x1.e79e79e79e7ap-4
T analytical 1.2698412698412700e-01 0x1.0410410410411p-3
T analytical 2.3809523809523836e-02 0x1.861861861862p-6
T numerical 0.0000000000000000e+00 0x0p+0
T numerical 1.1904761904761904e-01 0x1.e79e79e79e79ep-4
T numerical 1.2698412698412698e-01 0x1.041041041041p-3
T numerical 2.3809523809523812e-02 0x1.8618618618619p-6
FLT_EVAL_METHOD 0
“但是我的数值解和解析解是一样的”……那么……这是一个问题吗?除了:(i=0;i请正确格式化并缩进您的代码。现在很难读懂。为什么数值解与解析解精确匹配到任何给定的精度是一个问题?当然,人们希望最大限度地提高数值算法复制精确解析解的精度,是吗?预期结果是什么?“但是我的数值解和解析解是一样的”……那么……这是一个问题吗?除了:(i=0;i请正确格式化并缩进您的代码。现在很难读懂。为什么数值解与解析解精确匹配到任何给定的精度是一个问题?当然,人们希望最大限度地提高数值算法复制精确解析解的精度,是吗?预期结果是什么?@Anshuman Sinha如果打印精度更高,您的输出如何比较?您上面的代码{printf(“T analytic%.*e\T%a\n”,DBL_DECIMAL_DIG-1,z[i],z[i])}。在我的程序中不起作用。出现以下错误:main.c:在函数“main”中:main.c:26:43:错误:“DBL_DECIMAL_DIG”未声明(此函数首次使用)printf(“T analytic%.*e\T%a\n”,DBL_DECIMAL_DIG-1,z[i],z[i])@AnshumanSinha您是否包含了#include
?您使用的是什么C编译器/版本?是否兼容C99?(C99中引入了DBL_DECIMAL_DIG
)如果仍然有问题,请将DBL_DECIMAL_DIG
替换为17
或(DBL_DIG+3)
是的,我确实包含了#包含。我使用的是在线gdb.com网站上的在线编译器。它运行的是17。如何解释结果?T分析1.19047619047619041e-01 0x1.E79E79E79E79E79EP-4,1.19047619047619041e-01和0x1.E79E79E79E79E79E79E79EP-4一起的含义是什么?@Anshuman Sinha打印精度更高,如何解释您的输出比较?您的上述代码{printf(“T analytic%.*e\T%a\n”,DBL\u DECIMAL\u DIG-1,z[i],z[i])在我的程序中不起作用。显示以下错误:main.c:在函数“main”中:main.c:26:43:错误:“DBL\u DECIMAL\u DIG”未声明(在此函数中首次使用)printf(“T analytical%.*e\T%a\n”,DBL_DECIMAL_DIG-1,z[i],z[i])@AnshumanSinha您是否包含了#include
?您使用的是什么C编译器/版本?是否兼容C99?(C99中引入了DBL_DECIMAL_DIG
)如果仍然有问题,请将DBL_DECIMAL_DIG
替换为17
或(DBL_DIG+3)
是的,我确实包含了#include。我正在使用onlinegdb.com网站上的在线编译器。它正在运行17。如何解释结果?T分析1.19047619047619041e-01 0x1.E79E79E79E79E79EP-4,1.19047619047619041e-01和0x1.E79E79E79E79E79E79EP-4一起的含义是什么?