C言語で学ぶ大学の数学 準備編「多項式に数値を代入する」

この記事ではC言語で以下の計算をする方法を説明します。


・1変数多項式に数値を代入する

・次数が決められた多項式にユーザ関数を使って数値を代入する



1.1変数多項式に数値を代入する


これまで扱った多項式の加法や乗法は、多項式を「多項式環」の元とみなし、多項式環の演算を行ったものです。

今回は、多項式を「関数」とみなし、変数 x に具体的な数値を代入した値をC言語で求めることを目指します。

例として


a(x) = 1 - 2x + x^3


という多項式に


x = 2.1


を代入することとします。

これまでを振り返ると、まず多項式の係数を


int deg_a = 3;

float a[deg_a +1];

a[0] = 1;

a[1] = -2;

a[2] = 0;

a[3] = 1;


と格納します。

次に x に代入する値を格納します。


float x = 2.1;


また計算結果を格納するためのfloat 型の変数 result と、計算に使うint 型の変数 i が必要です。result は初期化します。


float result = 0;

int i;


a(2.1) の値はa(x) の i 次の項を順に計算して加算していけば計算できます。


for(i=0; i<=deg_a; i++){

 result += a[i]*pow(x,i);

}


この「pox(x,i)」は x^i を計算することのできる関数で、これを使うためにはソースコードの最初に「#include<math.h>」と書く必要があります。


今度は同じ多項式 a(x) = 1 - 2x + x^3 に任意の値を代入することを考えます。

つまり x をscanf で読み取らせるようにします。

その場合は次のようなソースコードを書きます。


#include<stdio.h>

#include<math.h>


int main(){

 int deg_a = 3;

 float a[deg_a +1], x ;

 a[0] = 1;

 a[1] = -2;

 a[2] = 0;

 a[3] = 1;

 printf("x=");

 scanf("%f",&x);

 int i;

 float result = 0;

 for(i=0; i<=deg_a; i++){

  result += a[i]*pow(x, i);

 }

 printf("a(%f) = %f \n", x, result); //ここで計算結果を表示

 return 0;

}


より一般には、多項式 a(x) の次数と係数をscanf で代入するところから始めることもできますが、ここでは省略します。


また、powを使わずに計算することも可能です。その場合はmath.hをインクルードする必要がなくなります。

その場合は次のようになります。


#include<stdio.h>


int main(){

 int deg_a = 3;

 float a[deg_a +1], x ;

 a[0] = 1;

 a[1] = -2;

 a[2] = 0;

 a[3] = 1;

 printf("x=");

 scanf("%f",&x);

 int i;

 float result = 0;

 float powx = 1;

 for(i=0; i<=deg_a; i++){

  result += a[i]*powx;

  powx *= x;

 }

 printf("a(%f) = %f \n", x, result); //ここで計算結果を表示

 return 0;

}


ポイントは x のべき乗をpowx という変数で計算していることです。

「*=」は右辺の値を左辺に掛けたものをpowx に代入するという意味です。

応用上はこちらの方が都合が良かったりします。それについては次回述べます。



2.ユーザ関数を使って多項式に数値を代入する


次に、多項式に数値を代入する操作をユーザ関数を使って実行します。

ユーザ関数の仕様上、多項式の次数が制限されてしまいます。ですが応用上はそれで問題ない場合もあります。

今回は次数が10以下の多項式だけを扱うこととします。


ユーザ関数を使わない方法を先程説明しましたが、計算のステップは

① 多項式の情報を格納する

② 代入する数値を格納する

③ 多項式に数値を代入する

の3ステップで行われました。このうち③をユーザ関数で行います。


計算に必要なものは多項式の情報と数値の情報なので、ユーザ関数の引数は


(float a[11], float x)


です。ここの 11という数字が固定のため、ユーザ関数を使う際は多項式の次数が制限されてしまいます。

計算結果は、上のソースコードにおける result なので、ユーザ関数の返り値の型は float にしておきます。ユーザ関数の名前は代入を意味する「substitution」にちなんで subst にしておきます。


float subst(float a[11], float x){

 int i;

 float result = 0;

 for(i=0; i<=10; i++){

 result += a[i]*pow(x, i);

 }

 return result;

}


main関数ですべきことは、①多項式の情報を格納し、②代入する数値を格納する、ことです。


int main(){

int deg_a = 10;

int i;

float x;

float a[deg_a +1];

float result;

for(i=0; i<=deg_a; i++){

printf("coeff of term x^%d of A(x)=",i);

scanf("%f",&a[i]);

}

printf("x=");

scanf("%f",&x);

result = subst(a,x); //ここでユーザ関数を使用

printf("A(num) = %f\n",result);

return 0;

}


このようにして、ユーザ関数を使って計算することもできます。


次回は、多項式に「多項式」を代入することを説明します。

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る