2012-07-11 63 views
-3

我想寫一個函數來計算多項式函數的導數。 degr是多項式的次數,arr是包含多項式係數的數組。我想要計算點t處的導數。如何計算多項式導數?

以下是我的嘗試,但總是返回0。我不明白什麼是錯的。

float derv(int degr,int arr[],float t) 
{ 
    int i,n; 
    float sum=0; 
    float arr2[degr+1]; 

    for (i=0;i<degr+1;i++) { 
    arr[i]=(arr[i]*(i+1)); 
    } 
    degr=degr-1; 
    for (i=0;i<degr+1;i++) 
    { 
    arr2[i] = (pow(t,degr-i)*arr[i]); 
    } 

    for(n=0;n<degr+1;n++) 
    { 
    sum = sum + arr2[n]; 
    } 
    return sum; 
} 
+4

另外,你嘗試添加打印語句(或使用調試器)檢查中間值的值? – 2012-07-11 20:27:16

+0

另外,你最好做數字... – 2012-07-11 20:30:39

+0

在哪裏宣佈...?編輯:啊,格式化固定... – bcr 2012-07-11 20:31:29

回答

1

讓我們來做一些假設。如果多項式看起來是這樣的:

  degr 
     .--- 
p(x) = >  arr[i] * pow(x, i) 
     `--- 
     i=0 

然後,衍生將由獲得:

  degr 
d   .--- 
-- p(x) = > i * arr[i] * pow(x, i-1) 
dx  `--- 
      i=1 

你應該能夠計算這個類似於Horner's method循環。

對於你的程序,你正在幾個循環中處理它,這是不必要的。但是,你的第一個循環試圖重新計算係數。第一個係數是一個常數,因此應用導數時應重新計算爲零。相反,你乘以(i+1)。改爲乘以i

在您的第二個循環中,您瞭解程度已經降低,但由於第一項爲0,因此不必減少degr變量。您應該從索引1開始循環。在for循環本身中,pow計算應該提高到i-1的功率。

在您的sum計算循環中,也從索引1開始。

您應該能夠看到我向您提出的更改是如何直接從上面提供的公式得出的。

請注意,由於您修改了表示多項式的數組,因此不能再次調用該函數來計算不同值的導數。您可以通過修改第一個循環來修復這個問題,以便將係數存儲在arr2中,然後更改第二個循環,以便從arr2獲取係數。現在,您可以聲明您的輸入數組在您的derv函數中保持不變。

與我的建議的修改的代碼如下所示:

float derv(int degr,const int arr[],float t) 
{ 
    int i,n; 
    float sum=0; 
    float arr2[degr+1]; 

    for (i=0;i<degr+1;i++) { 
    arr2[i]=(arr[i]*i); 
    } 
    for (i=1;i<degr+1;i++) 
    { 
    arr2[i] = (pow(t,i-1)*arr2[i]); 
    } 

    for(n=1;n<degr+1;n++) 
    { 
    sum = sum + arr2[n]; 
    } 
    return sum; 
} 
+0

我不確定這是怎麼回答的問題。 – 2012-07-11 20:56:06

+0

@OliCharlesworth:OP似乎不知道導數的公式是什麼,因爲它的計算錯誤。問候 – jxh 2012-07-11 20:58:01

+0

我想象OP知道評估多項式導數背後的數學(如果沒有,代碼看起來*幾乎*不正確)。但問題是代碼有什麼問題? – 2012-07-11 21:00:05