#2
by みけCAT » 5年前
プログラミング言語が指定されていないようですが、例えば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
プログラミング言語が指定されていないようですが、例えばC++であればこのような感じでしょうか?
[code]
#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;
}
[/code]
[url=https://wandbox.org/permlink/ofoHjBJ2BoHC7Eb8]実行結果[/url]
[code]
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
[/code]