1. 程式人生 > >常見演算法-多項式計算 1

常見演算法-多項式計算 1

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

最近在學演算法,做做筆記,便於以後溫習。

學習資源:《常用演算法程式集》


一。多項式求值

1.一維多項式

問題描述:計算形如

的多項式在指定點x處的函式值。

問題分析:首先,將多項式表述成如下巢狀形式:


然後從裡往外一層一層地進行計算。其遞推計算公式如下:



最後得到的u即多項式值。


下面,通過程式碼計算此多項式:

#include <stdio.h>/*  polynome_one函式介紹 功能:計算並返回一維多項式在指定點x處的函式值 引數:           int n:多項式的項數              double x:指定的自變數的值 double *modulus_array:存放n-1次多項式的n個係數的陣列 */
double polynome_one(int n, double x, double *modulus_array){    int i;    double result_;     //利用推匯出的遞推公式進行計算    result_ = modulus_array[n-1];        for (i=n-2; i>=0; i--)    {        result_ = result_ * x + modulus_array[i];    }        return
result_;  //返回多項式值}int main(){    int i;    double modulus_array[7] = {-20.0, 7.0, -7.0, 1.0, 3.0, -5.0, 2.0}; //初始化係數陣列    double x[6] = {0.9, -0.9, 1.1, -1.1, 1.3, -1.3};  //初始化自變數x陣列        for (i=0; i<=5; i++) //列印每次x對應的結果。     {        printf("x(%d) = %5.2lf   p(x(%d)) = %13.7e\n", i, x[i], i, polynome_one(7, x[i], modulus_array));    }    return 0;}//注:%e 是表示輸出的數字以科學計數顯示      如:7.234568e+003(即 7.234568*10^(+003) )/*  ****************結果******************* x(0) =  0.90   p(x(0)) = -1.8562268e+01 x(1) = -0.90   p(x(1)) = -2.6715368e+01 x(2) =  1.10   p(x(2)) = -1.9556128e+01 x(3) = -1.10   p(x(3)) = -2.1513028e+01 x(4) =  1.30   p(x(4)) = -2.0875732e+01 x(5) = -1.30   p(x(5)) = -6.3404320e+00*/




2.二維多項式

問題描述: 計算形如的二維多項式在給定點(x,y)處的函式值


問題分析: 將二維多項式變形如下:


令:

則計算si的遞推公式如下:



最後計算得到的u即si

最後再將所有的si累加,即可得到最後的解。


下面通過程式碼計算此多項式

其中,係數矩陣為:

#include <stdio.h>/*  polynome_two函式介紹 功能:計算並返回二維多項式在指定點x處的函式值 引數:           int n:自變數y的最高次數為n-1                 int m:自變數x的最高次數為m-1              double x:指定的自變數x的值              double y:指定的自變數y的值 double *modulus_array:存放二維多項式的係數 */double polynome_two(double *modulus_array, int m, int n, double x, double y){    int i, j;    double result_, each_si, now_xi;    result_ = 0.0;    now_xi = 1.0;        for (i=0; i<=m-1; i++)    {        each_si = modulus_array[i*n+n-1] * now_xi;        for (j=n-2; j>=0; j--)        {            each_si = each_si * y + modulus_array[i*n+j] * now_xi;        }                result_ += each_si;        now_xi = now_xi * x;    }    return  result_;}int main(){    double result_;    double modulus_array[4][5] = {{1.0, 2.0, 3.0, 4.0, 5.0},                                {6.0, 7.0, 8.0, 9.0, 10.0},                                {11.0, 12.0, 13.0, 14.0, 15.0},                                {16.0, 17.0, 18.0, 19.0, 20.0}};        result_ = polynome_two(modulus_array, 4, 5, 0.6, -1.3);    printf("p(0.6, -1.3) = %13.7e\n", result_);    }//注:%e 是表示輸出的數字以科學計數顯示      如:7.234568e+003(即 7.234568*10^(+003) )/*  ****************結果*******************

  p(0.6, -1.3) = 3.9665544e+01

*/



3.複數多項式

問題描述:計算形如

的複數多項式在給定複數z時的值。


問題分析:和上面的多項式分析一樣,巢狀進行,就不多重複了。關鍵在於cmul對每組複數相乘的計算過程。


下面通過程式碼,計算

在z=1+j時的函式值

#include <stdio.h>/*  cuml函式介紹 功能:計算兩個複數乘積   即(a+bj)*(c+dj) = e+fj 引數: 對應複數中的各個值 結果: 對e,f分別計算求得值*/void cmul(double a, double b, double c, double d, double *e, double *f){    double p, q, s;    p = a * c;    q = b * d;    s = (a+b) * (c+d);        *e = p - q;    *f = s - p - q;}/*  polynome_z函式介紹 功能:計算複數多項式在給定複數z(x+yj)時的函式值 引數: double *modulus_r: 存放多項式的實部      double *modulus_r: 存放多項式的虛部               double x: 給定複數z的實部               double y: 給定複數z的虛部              double *u: 返回多項式值的實部              double *v: 返回多項式值的虛部 */void polynome_z(double *modulus_r, double *modulus_i, int n, double x, double y, double *u, double *v){    int i;    double now_r, now_i;    double p, q;    now_r = modulus_r[n-1];    now_i = modulus_i[n-1];    for (i=n-2; i>=0; i--)    {        cmul(now_r, now_i, x, y, &p, &q);        now_r = p + modulus_r[i];        now_i = q +  modulus_i[i];    }        *u = now_r;    *v = now_i;}int main(){    double x, y, u, v;    double modulus_r[4] = {2.0, 2.0, 1.0, 2.0};    double modulus_i[4] = {1.0, 1.0, 1.0, 2.0};        x = 1.0;    y = 1.0;    polynome_z(modulus_r, modulus_i, 4, x, y, &u, &v);    printf("p(1.0+j) = %10.7lf+%10.7lfj", u, v);    }//注:%e 是表示輸出的數字以科學計數顯示      如:7.234568e+003(即 7.234568*10^(+003) )//計算結果:  p(1.0+j) = -7.0000000+ 6.0000000j



二。多項式乘法


1.多項式相乘(實數)


演算法本身沒什麼難度,兩個迴圈,遍歷p,q兩個多項式各個項的係數相乘,所得結果加到對應結果項上。

下面通過程式碼計算



#include <stdio.h>/* ***********polynome_mul函式功能介紹*************//* 函式功能:計算兩個多項式相乘                      *//* 引數說明:*polynome_first,第一個多項式係數陣列     *//*         *polynome_second,第二個多項式係數陣列    *//*         *polynome_result,相乘結果多項式係數陣列   *//* num_first,num_second,num_result分別對應多項式項數*//* ******************************************** */void polynome_mul(double *polynome_first, double *polynome_second, double *polynome_result, int num_first, int num_second, int num_result){    int i, j;        for (i=0; i<num_result; i++)  //先初始化為0,(下面加法要用到,不初始化出錯)    {        polynome_result[i] = 0.0;    }    for (i=0; i<num_first; i++)    {        for (j=0; j<num_second; j++)   //S(i+j) = S(i+j) + P(i)*p(j) 演算法核心        {            polynome_result[i+j] = polynome_result[i+j] + polynome_first[i] * polynome_second[j];        }    }}int main(){    int i;    double polynome_first[6] = {4.0, -6.0, 5.0, 2.0, -1.0, 3.0};    double polynome_second[4] = {2.0, 3.0, -6.0, 2.0};        double polynome_result[9];  // 6+4-1    polynome_mul(polynome_first, polynome_second, polynome_result, 6, 4, 9);    for (i=0; i<9; i++)    {        printf("S(%d) = %13.7e\n", i, polynome_result[i]); //列印結果為各個項的係數    }}//注:%e 是表示輸出的數字以科學計數顯示      如:7.234568e+003(即 7.234568*10^(+003) )/*計算結果: S(0) = 8.0000000e+00 S(1) = 0.0000000e+00 S(2) = -3.2000000e+01 S(3) = 6.3000000e+01 S(4) = -3.8000000e+01 S(5) = 1.0000000e+00 S(6) = 1.9000000e+01 S(7) = -2.0000000e+01 S(8) = 6.0000000e+00 */



           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述