簡體   English   中英

如何用C語言將在程序中正在計算的變量作為指針(例如使用梯形規則)進行數字積分

[英]how to numerically integrate a variable that is being calculate in the program as a pointer (using e.g. trapezoidal rule) in c language

我有一個不是我編寫的代碼。 在這個復雜的代碼中,許多規則被應用於計算數量d(x)。 在代碼中使用了一個指針來計算它。

我想計算一個積分,例如:W = Int_0 ^ L d(x)dx?

我正在這樣做:

#define DX 0.003
void WORK(double *d, double *W)
{
    double INTE5=0.0;
    int N_X_POINTS=333;
    double h=((d[N_X_POINTS]-d[0])/N_X_POINTS); 
    W[0]=W[0]+((h/2)*(d[1]+2.0*d[0]+d[N_X_POINTS-1])); /*BC*/
    for (i=1;i<N_X_POINTS-1;i++) 
    {
        W[i]=W[i]+((h/2)*(d[0]+2*d[i]+d[N_X_POINTS]))*DX;
        INTE5+=W[i];
    }
    W[N_X_POINTS-1]=W[N_X_POINTS-1]+((h/2)*(d[0]+2.0*d[N_X_POINTS-1]+d[N_X_POINTS-2])); /*BC*/
}

而且我收到“細分錯誤”。 我想知道是不是要正確地將W作為指針進行計算,還是應該將其聲明為簡單的double? 我猜想細分錯誤即將到來。

另外一點,我是否正確使用了梯形規則?

任何幫助/提示,​​將不勝感激。

路易斯

我不知道該代碼從哪里來,但是它很丑陋,並且有一些硬編碼的限制(333點,增量為0.003)。 要使用它,您需要正確地對函數進行“采樣”並生成對(x,f(x))...

這里是解決您的問題的可能更清晰的解決方案。

讓我們考慮一下您的函數,並假設它可以工作(我相信它不會,這是一個非常晦澀的代碼……;例如,當您集成一個函數時,您期望得到一個數字;這個數字在哪里?也許是INTE5?沒有返回...如果是這樣,為什么還要對W數組進行最終更新呢?它沒有用,或者也許我們對W有一些有意義的東西?)。 您將如何使用它?

原型

  void WORK(double *d, double *W);

表示該工作需要兩個指針。 這些指針必須是什么取決於代碼。 一看就知道確實需要兩個數組,每個數組都有N_X_POINTS個元素。 代碼從數組W中讀取和寫入,僅從d中讀取。 N_X_POINTS int是333,因此您需要傳遞至少333個double的函數數組:

   double d[333];
   double W[333];

然后,您必須正確填充它們。 我認為您需要用(x,f(x))填充它們,並通過適當的步驟對函數進行采樣。 但這當然沒有太大意義。 已經說過代碼是晦澀的(現在我不想嘗試對編碼器的意圖進行逆向工程……)。

無論如何,如果使用WORK(d, W)調用,則不會出現段錯誤,因為數組足夠大。 結果將是錯誤的,但這很難跟蹤(再次,對不起,沒有“反向工程”)。

最后說明(也來自注釋):如果您有double a[N] ,則a類型為double *

當您嘗試訪問不應訪問的內存部分時,通常會在C中發生分段錯誤錯誤。 我懷疑表達式d[N_X_POINTS]是罪魁禍首(因為C中的數組的索引為零),但是沒有看到d的定義,我不確定。

嘗試在printf每一行代碼之前/之后放置內容豐富的printf調試語句,以便縮小問題的可能根源。

這是一個簡單的程序,它在[0..10]范圍內集成$ f(x)= x ^ 2 $。 它應該向正確的方向發送信息。

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

double int_trapezium(double f[], double dX, int n)
{
   int i;
   double sum;

   sum = (f[0] + f[n-1])/2.0;
   for (i = 1; i < n-1; i++)
       sum += f[i];
   return dX*sum;
}

#define N 1000
int main()
{
    int i;
    double x;
    double from = 0.0;
    double to = 10.0;
    double dX = (to-from)/(N-1);
    double *f = malloc(N*sizeof(*f));

    for (i=0; i<N; i++)
    {
        x = from + i*dX*(to-from);
        f[i] = x*x;
    }
    printf("%f\n", int_trapezium(f, dX, N));
    free(f);
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM