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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nonteas

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

#1

投稿記事 by nonteas » 3週間前

X^(-(t1)) + X^(-(t2)) + ... + X^(-(tn))をfという変数で定義したいです.
t1からtnは配列に実数値で読みこんでおります.

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

ご教授お願い致します.

アバター
みけCAT
記事: 6235
登録日時: 9年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 3週間前

プログラミング言語が指定されていないようですが、例えば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
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

nonteas

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

#3

投稿記事 by nonteas » 3週間前

みけCAT 様

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

アバター
みけCAT
記事: 6235
登録日時: 9年前
住所: 千葉県
連絡を取る:

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

#4

投稿記事 by みけCAT » 3週間前

プログラムはやりたいことに合わせて書くのがいいと思います。
「X^(-(t1)) + X^(-(t2)) + ... + X^(-(tn))をfという変数で定義」
「f = X^(1.5) + X^(2.0) + X^(1.0) のように」
とはどういうことか、もう少し詳しく教えていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

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

#5

投稿記事 by かずま » 3週間前

質問が間違っているような気がします。
課題として与えられているのなら、それを一字一句変更せずに
そのまますべて書いてください。
また、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 を与えてみた
}

アバター
あたっしゅ
記事: 255
登録日時: 9年前
住所: 東京23区
連絡を取る:

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

#6

投稿記事 by あたっしゅ » 3週間前

f=X^(-(t1)) + X^(-(t2)) + ... + X^(-(tn))

の元の記述は、


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


でしょうか ?

とりあえず、式を書くだけで疲れたので、今日は、ここまで。
手提鞄あたっしゅ、[MrAtassyu] http://ameblo.jp/mratassyu/
手提鞄屋魚有店(てさげかばんやうおありてん)
レスがついていないものを優先して、レスしています。時々、見当外れなレスをします。

返信

“C言語何でも質問掲示板” へ戻る