【问题标题】:2D interpolation in CC 中的 2D 插值
【发布时间】:2015-09-30 00:40:06
【问题描述】:

所以这个程序应该询问用户Kelvins 的温度和起始Ne。然后进行插值以找到给定的值。

temp 数组是所有温度,用于查找我们之间的温度。

n 数组是所有 Ne 的,用于查找我们之间的 Ne。

我们在每个点中获得的任何点最终都会成为我们在更大的阵列 HPE 中插值的点。

主函数要求用户输入温度和Ne,并调用插值函数。

interpol 函数是进行插值的函数。首先,它找到给定温度在 temp 数组中的位置。然后它找到给定的 Ne 在 n 数组中的位置。然后它使用该点 (HPE[k][l]) 进行 2D 插值。

我的问题是当我运行它并输入应该给我答案的值时,我得到“确定的值是nan

我做错了什么?

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

double interpol(double Ti, double Ne);

int main()
{
    int ni;
    double Ti, result, Ne;

    printf("\nEnter the temperature in kelvins and Ne separated by a space.\n");
    ni = scanf("%lf %lf", &Ti, &Ne);
    result = interpol(Ti, Ne);
    printf("\nThe value determined is %lf\n", result);
}


double interpol(double Ti, double Ne)
{
    int i, j, k, l;
    double y1, y2, y3, y4, t, u, p;
    double temp[15] = {
        1000.0, 2000.0, 3000.0, 4000.0, 5000.0,
        6000.0, 7000.0, 8000.0, 9000.0, 10000.0,
        11000.0, 12000.0, 13000.0, 14000.0, 15000.0};
    double n[8] = {10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0};
    double HPE[15][8] = {
        {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
        {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
        {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
        {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
        {0.0017, 0.0002, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
        {0.2980, 0.0407, 0.0042, 0.0004, 0.0, 0.0, 0.0, 0.0},
        {0.9582, 0.6961, 0.1864, 0.0224, 0.0023, 0.0002, 0.0, 0.0},
        {0.9979, 0.9791, 0.8241, 0.3191, 0.0448, 0.0047, 0.0005, 0.0},
        {0.9998, 0.9980, 0.9804, 0.8335, 0.3335, 0.0477, 0.0050, 0.0005},
        {1.0, 0.9997, 0.9971, 0.9713, 0.7719, 0.2529, 0.0327, 0.0034},
        {1.0, 0.9999, 0.9994, 0.9939, 0.9425, 0.6211, 0.1408, 0.0161},
        {1.0, 1.0, 0.9998, 0.9984, 0.9841, 0.8606, 0.3817, 0.0581},
        {1.0, 1.0, 0.9999, 0.9995, 0.9948, 0.9503, 0.6568, 0.1607},
        {1.0, 1.0, 1.0, 0.9998, 0.9980, 0.9807, 0.8358, 0.3373},
        {1.0, 1.0, 1.0, 0.9999, 0.9992, 0.9917, 0.9229, 0.5448}
    };

    for (i = 1 ; i < 16 ; i++)
    {
        if (temp[i] <= Ti && temp[i+1] >= Ti)
        {
            k = i;
            break;
        }
    }

    for (j = 1 ; j < 9 ; j++)
    {
        if (n[j] <= Ne && n[j+1] >= Ne)
        {
            l = j;
            break;
        }
    }

    y1 = HPE[k][l];
    y2 = HPE[k+1][l];
    y3 = HPE[k+1][l+1];
    y4 = HPE[k][l+1];

    t = (Ti - (HPE[k][0])) / ((HPE[k+1][0]) - (HPE[k][0]));
    u = (Ne - (HPE[0][l])) / ((HPE[0][l+1]) - (HPE[0][l]));
    p = ((1 - t) * (1 - u) * y1) + (t * (1 - u) * y2) + (t * u * y3) + ((1 - t) * u * y4);

    return (p);
}

【问题讨论】:

  • 您从scanf() 捕获返回值,但您不使用它,为什么?并且请不要为 return 使用括号,这很丑,并且使 return 看起来像一个函数。
  • 你在哪里防止被0(或你的除数接近0)分割?
  • 变量ni 正在设置中,但从未使用过。强烈指示逻辑错误。
  • 代码中有几个“幻数”(如 16、9、15、8)以避免这些幻数在理解代码时产生的问题并避免未来的维护问题,强烈建议使用 enum 或 #define 为这些幻数赋予有意义的名称,并在整个代码中使用这些有意义的名称
  • 这个语句(类似于代码中的一些其他语句:) for (i = 1 ; i &lt; 16 ; i++) 因为 C 中的数组偏移量从 0 开始,所以不能正确处理 temp 数组中的偏移量。更好的说法是:for (i = 0 ; i &lt; 15 ; i++) 甚至更好:for (i = 0 ; i &lt; (sizeof( temp)/sizeof(temp[0]) ; i++)

标签: c arrays multidimensional-array interpolation


【解决方案1】:

对于任何 程序员来说,您都有一个明显的错误, 中大小为N 的数组的索引从0N - 1。在某些语言中,大小为N 的数组将从1 索引到N,例如,但在 中,它是从0N - 1

【讨论】:

  • 正确!这对于用 C 编程绝对至关重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 2020-02-11
  • 1970-01-01
相关资源
最近更新 更多