ページ 11

f=X^(-(t1)) + X^(-(t2)) + ... + X^(-(tn))の定義の仕方

Posted: 2019年10月17日(木) 21:10
by nonteas
X^(-(t1)) + X^(-(t2)) + ... + X^(-(tn))をfという変数で定義したいです.
t1からtnは配列に実数値で読みこんでおります.

f = X^(1.5) + X^(2.0) + X^(1.0)
のようにしたいのですが,プログラムの書き方が分かりません.

ご教授お願い致します.

Re: f=X^(-(t1)) + X^(-(t2)) + ... + X^(-(tn))の定義の仕方

Posted: 2019年10月17日(木) 22:46
by みけCAT
プログラミング言語が指定されていないようですが、例えばC++であればこのような感じでしょうか?

コード:

#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
#include <sstream>
#include <cmath>

class siki {
	// t1からtnを格納する
	std::vector<double> t;
public:
	siki() {}
	// t1からtnの配列に基づき式を初期化する
	siki(const double* array, size_t n) : t(array, array + n) {}

	// Xに値を代入して式を計算する
	double operator()(double X) const {
		// 合計を格納する
		double ret = 0;
		// 各要素について処理する
		for (std::vector<double>::const_iterator itr = t.begin(); itr != t.end(); itr++) {
			// *itr で各要素を取得できる
			// X^(-(t1)) + ... の形式に合わせるため、マイナスをつける
			ret += pow(X, -*itr);
		}
		return ret;
	}

	// 式を文字列に変換する
	std::string str() const {
		bool first = true;
		std::stringstream ss;
		// 小数点以下を1桁固定で出力するようにする
		ss << std::fixed << std::setprecision(1);
		// 各要素について処理する
		for (std::vector<double>::const_iterator itr = t.begin(); itr != t.end(); itr++) {
			// 2番目以降の項の前に " + " を挿入する
			if (!first) ss << " + ";
			first = false;
			// 項を文字列に変換する
			// *itr で各要素を取得できる
			// X^(-(t1)) + ... の形式に合わせるため、マイナスをつける
			ss << "X^(" << -*itr << ")";
		}
		return ss.str();
	}
};

// std::cout << f の形で出力できるようにする
std::ostream& operator<<(std::ostream& stream, const siki& value) {
	stream << value.str();
	return stream;
}

int main(void) {
	// t1からtnを読み込んである配列
	double t[] = {-1.5, -2.0, -1.0};

	// fという変数で定義する
	siki f(t, sizeof(t) / sizeof(*t));

	// 式を出力する
	std::cout << "f = " << f << std::endl;

	// 値を代入してみる
	double X[] = {0.1, 0.5, 1.0, 1.5, 2.0, 3.0, 5.0};
	for (size_t i = 0; i < (sizeof(X) / sizeof(*X)); i++) {
		std::cout << "f(" << X[i] << ") = " << f(X[i]) << std::endl;
	}

	return 0;
}
実行結果

コード:

f = X^(1.5) + X^(2.0) + X^(1.0)
f(0.1) = 0.141623
f(0.5) = 1.10355
f(1) = 3
f(1.5) = 5.58712
f(2) = 8.82843
f(3) = 17.1962
f(5) = 41.1803

Re: f=X^(-(t1)) + X^(-(t2)) + ... + X^(-(tn))の定義の仕方

Posted: 2019年10月17日(木) 23:08
by nonteas
みけCAT 様

C言語で記述することは可能でしょうか.
可能でしたら宜しくお願い致します.

Re: f=X^(-(t1)) + X^(-(t2)) + ... + X^(-(tn))の定義の仕方

Posted: 2019年10月18日(金) 22:09
by みけCAT
プログラムはやりたいことに合わせて書くのがいいと思います。
「X^(-(t1)) + X^(-(t2)) + ... + X^(-(tn))をfという変数で定義」
「f = X^(1.5) + X^(2.0) + X^(1.0) のように」
とはどういうことか、もう少し詳しく教えていただけますか?

Re: f=X^(-(t1)) + X^(-(t2)) + ... + X^(-(tn))の定義の仕方

Posted: 2019年10月19日(土) 19:19
by かずま
質問が間違っているような気がします。
課題として与えられているのなら、それを一字一句変更せずに
そのまますべて書いてください。
また、t1からtnは配列に実数値で読みこむコードを提示してください。

次のコードは期待するものでしょうか?

コード:

#include <stdio.h>  // printf
#include <math.h>   // pow

double t[] = { -1.5, -2.0, -1.0 };
int n = sizeof t / sizeof t[0];

double F(double X)
{
	double v = 0;
	for (int i = 0; i < n; i++) v += pow(X, -t[i]);
	return v;
}

int main(void)
{
	double (*f)(double) = F;  // f は変数
	printf("%f\n", f(2.5));   // X に 2.5 を与えてみた
}

Re: f=X^(-(t1)) + X^(-(t2)) + ... + X^(-(tn))の定義の仕方

Posted: 2019年10月21日(月) 20:10
by あたっしゅ
f=X^(-(t1)) + X^(-(t2)) + ... + X^(-(tn))

の元の記述は、


f=X-t1+X-t2+X-t3+...+X-tn


でしょうか ?

とりあえず、式を書くだけで疲れたので、今日は、ここまで。