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;
}
このようにして、ユーザ関数を使って計算することもできます。
次回は、多項式に「多項式」を代入することを説明します。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます