ページ 11

微分係数を求めるプログラムを作っています

Posted: 2017年5月12日(金) 21:10
by masuter
こんばんは。
高校生でC言語でプログラミングを学んでいます。
先日学校で、以下のような課題が出ました。

以下を満たすプログラムを完成させよ。
(1) 引数 x (double型)と n (int型)を与えて x^n の値を返すdouble型の関数 powerを定義。
(2) 引数 x (double型)と n (int型)を与えて x^n の微分係数((x^n)’の値,n x^(n -1)を計算してxの値を入れる)を返すdouble型の関数 diff を定義。ただし(1)の関数powerを呼び出して使うこと。
(3) main関数で 値 x と n を入力させ,関数 power と diff を呼び出し,それぞれの値を例のように表示させる。
  (注) 数学用ライブラリ関数(math.hのpowなど)は使えないとする。
<実行例>
x を 入力してください: 4.2
n を 入力してください(n>0): 5
x^n = 1306.912320
(x^n)' = 1555.848000

(1)は自分でできました。お聞きしたいのは(2)です。
まず、「ただし(1)の関数powerを呼び出して使うこと。」とありますが、違う計算をするのになぜ呼び出すのですか?呼び出す意味はありますか?

コード:

#include <stdio.h>

double power(double x, int n) {
	double y = 1;
	for (int i = 1; i <= n; i++)
		y = y*x;
	return y;
}
int main() {
	double num1 = 0;
	int num2 = 0;
	double d = 0;
	printf_s("xを入力してください\n>");
	scanf_s("%lf", &num1);
	printf_s("nを入力してください(nは自然数)\n>");
	scanf_s("%d", &num2);

	d = power(num1, num2);
	printf_s("%f^%d = %f です。\n", num1, num2, d);
	return 0;
}

Re: 微分係数を求めるプログラムを作っています

Posted: 2017年5月12日(金) 21:20
by purin52002
数学の話に寄っていきます。
数学は苦手ですのでご了承ください^^;

今回は微分がわかっているので手打ちで計算すればいい気もしますが、
微分がわからない関数を微分する必要が出てくることがあります。

そういうときに導関数の公式を使います。

公式
(f(x+h)-f(x))/h (lim h->0)

プログラムでもこの公式を使うことで微分ができます。
(hは適当に小さい値にする)

Re: 微分係数を求めるプログラムを作っています

Posted: 2017年5月12日(金) 22:09
by みけCAT
masuter さんが書きました:まず、「ただし(1)の関数powerを呼び出して使うこと。」とありますが、違う計算をするのになぜ呼び出すのですか?呼び出す意味はありますか?
ここで呼び出す主な意味は、関数呼び出しの練習でしょう。
xの(n-1)乗を計算するので、power関数を使うといいでしょう。
オフトピック
purin52002 さんが書きました:数学の話に寄っていきます。
数学は苦手ですのでご了承ください^^;
どうしてわざわざ質問にほとんど関係ない上に苦手な数学の話に寄ったのですか?

Re: 微分係数を求めるプログラムを作っています

Posted: 2017年5月12日(金) 22:38
by purin52002
、、、完全に勘違いしていました^^;

てっきり微分を数値計算するためにpower関数を使え、ということかと思ったのですが
xの(n-1)乗を計算するために使えってことなんですね^^;

masuterさん、余計な話をして申し訳ないです<(__)>

Re: 微分係数を求めるプログラムを作っています

Posted: 2017年5月13日(土) 01:27
by box
みけCAT さんが書きました: どうしてわざわざ質問にほとんど関係ない上に苦手な数学の話に寄ったのですか?
数学があまり得意でない方が数学に関する投稿をしてもいっこうに差し支えないのでは?
ここの掲示板には、ある分野があまり得意ではない方がその分野に関する投稿をしていけないという
ルールでもあるんですか?

Re: 微分係数を求めるプログラムを作っています

Posted: 2017年5月13日(土) 01:40
by box
masuter さんが書きました: (1) 引数 x (double型)と n (int型)を与えて x^n の値を返すdouble型の関数 powerを定義。
(2) 引数 x (double型)と n (int型)を与えて x^n の微分係数((x^n)’の値,n x^(n -1)を計算してxの値を入れる)を返すdouble型の関数 diff を定義。ただし(1)の関数powerを呼び出して使うこと。
まず、「ただし(1)の関数powerを呼び出して使うこと。」とありますが、違う計算をするのになぜ呼び出すのですか?呼び出す意味はありますか?
この疑問に対する答えは、別の回答者さんからの回答のとおりです。
(2)においてべき乗を求める必要があります。その、べき乗を求める関数powerは、
(1)において自作されています。それを呼び出しましょう、ということです。

Re: 微分係数を求めるプログラムを作っています

Posted: 2017年5月13日(土) 01:59
by みけCAT
box さんが書きました:
みけCAT さんが書きました: どうしてわざわざ質問にほとんど関係ない上に苦手な数学の話に寄ったのですか?
数学があまり得意でない方が数学に関する投稿をしてもいっこうに差し支えないのでは?
ここの掲示板には、ある分野があまり得意ではない方がその分野に関する投稿をしていけないという
ルールでもあるんですか?
なんでわざわざ苦手だと宣言しながら関係なさそうな投稿をするのか不思議だっただけで、いけないとは言っていないです。

Re: 微分係数を求めるプログラムを作っています

Posted: 2017年5月15日(月) 16:23
by masuter

コード:

#include <stdio.h>

double power(double x, int n) {
	double r = 1;
	for (int i = 1; i <= n; i++)
		r = r*x;
	return r;
}
double diff(double x, int n) {
	double r = 0;
	r = n*power(x, n-1);
	return r;
}
int main() {
	double num1 = 0;
	int num2 = 0;
	double result1 = 0;
	double result2 = 0;
	printf_s("xを入力してください\n>");
	scanf_s("%lf", &num1);
	printf_s("nを入力してください(nは自然数)\n>");
	scanf_s("%d", &num2);

	result1 = power(num1, num2);
	result2 = diff(num1, num2);
	printf_s("%f^%d = %f です。\n", num1, num2, result1);
	printf_s("(%f^%d)' = %f です。\n", num1, num2, result2);

	return 0;
}
できました!ありがとうございました。