別に積分に限らないと思うのですが、積分を例にして質問させていただきます。
次のようなルーチンがあります。
integral( double (*func)(double), double a, double b );
/* a~bまで関数funcを積分する。 */
そこで、簡単に被積分関数を
fx=3*x とすれば、
double fx(double x)
{
return 3*x;
}
というようにすれば良いですよね。
でも、例えば
fx = exp(x-X) とか fx = x*X
のような関数を積分したいときはどうすればよいのでしょうか?
Xは変数ですが、xにはよらないので積分の中では定数とみなせます。
ループで
X=0 のときにfxを積分
X=1 のときにfxを積分
X=2 のときにfxを積分…
というようにしたいのですが、
fxの引数をfx(double x, double X)
とすると、プロトタイプ宣言もルーチンの中も書き換えなければならなくなりますよね。
さらに fx = x-X + x' などとなったりすると、さらに書き換えなければならなくなり、せっかくの積分のルーチンをうまく使えません。
Xをグローバルで宣言する方法と、
プログラミングの前に、x-X を x' などと置きかえた式を実際に手計算で作る方法を思いついたのですが、
グローバル変数を使うのはあまりよくないし、手計算では簡単な場合しか置換を思いつかなかったりします。
fxの中で X を宣言して、
double fx(double x)
{
static double X;
double y;
y = x-X;
X++;
return y;
}
という方法も考えたのですが、どうもイマイチ良くないような…
こういう場合に、良い方法はありますか?
ここには簡単な関数を書きましたが、少し複雑な関数を積分するので。
質問の意図がうまく伝わらなかったらすいません。
書きにくかったです。
No.4ベストアンサー
- 回答日時:
> fxの中の *(double*)params
> がどういう扱い方をしているのか教えていただけないでしょうか?
たとえば f(x) = x * X で X が 3.0 のとき、integral を使うには:
double f(double x, void* params) {
double X = *(double*)paramsl
return x * X;
}
...
double X = 3.0;
double result = integral(f, &X, a, b);
No.3
- 回答日時:
現状から大きく変わるので、単なる案です。
C++もありと考えると、積分関数を定義して渡すのではなく、
関数をメソッドとして実装している関数オブジェクトを
integral関数に渡すと、面白いかもしれません。
・実行しようとする関数のオブジェクトを生成
・定数など必要な物をオブジェクトに設定
・integralにオブジェクトと範囲a,bを渡す
・integralでは、オブジェクト内の関数メソッドをcall(名前は固定)
・関数オブジェクトではパラメータxと内部の定数で値を返す
みたいな感じです。
Cでも、構造体(or共用体)で似た実装をすることは可能でしょう。
(構造体中に関数ポインタと定数メンバを設ける感じ)
No.2
- 回答日時:
integralのインターフェースを変えないという前提で考えると、
外部static変数を使うのはどうでしょう。
static double X;
double fx(double x) {
・・・
}
void setParameter(double p) {
X = p;
}
というようにしておけば、Xはこのソースファイルの外からは直接アクセスできません。
integralを呼び出す前に予めsetParameterでXをセットしておきます。
No.1
- 回答日時:
僕ならこうする:
integral( double (*func)(double,void*), void* params, double a, double b ); {
...
(*func)(x,params);
...
}
double fx(double x, void* params) {
double X = *(double*)params;
...
}
void* params を介して受け渡します。
回答ありがとうございます。
でも、すいません。
初心者なので、このプログラムがよく分からないです。
(*func)(double, void*), void* params,
の宣言は何を意図しているのか。
fxの中の
*(double*)params
がどういう扱い方をしているのか教えていただけないでしょうか?
すいません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- 統計学 統計学の連続確率変数 1 2022/07/15 21:03
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C++で割り算の結果を昇順に出力するプログラムを作りたいのですが、例えば(double)100000 3 2022/07/15 17:46
- 物理学 『数か物か』 4 2022/06/13 06:54
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
C言語 関数プロトタイプ宣言の...
-
C言語で台形公式を使った二重積...
-
関数におけるif文とreturn文に...
-
C言語(プログラミング)関連の質...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
数値を指数部と仮数部に分離したい
-
マチンの公式による円周率のプ...
-
至急です! マクロ定義で #defi...
-
C# 分秒表示ついて
-
c言語で、繰り返し文の中で、0....
-
C言語でdouble型の小数点の引き...
-
学校の課題で2次方程式のプログ...
-
ニュートン法
-
C言語で表記についの質問です
-
c言語の問題
-
2分法で方程式の複数の解を自...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
至急です! マクロ定義で #defi...
-
c言語で、繰り返し文の中で、0....
-
関数におけるif文とreturn文に...
-
C言語 関数プロトタイプ宣言の...
-
C言語初心者 構造体 課題について
-
C言語の型による処理速度の違い
-
Cで3乗根を求める方法
-
C言語で-23乗を取り扱うには
-
2分法で方程式の複数の解を自...
-
doubleは常に%lfとするべきなのか
-
c言語のコンパイルエラー canno...
-
C言語で直角三角形の斜辺を求め...
-
C言語のプログラムで#include<m...
-
int とdoubleの比較
-
C++で外積
おすすめ情報