• 締切済み

大学の宿題で

大学のCの宿題で以下のような課題がでました シンプソンの公式を使って、次の定積分の値を返す関数 double Simpson(double a,double b,double (*f)(double)); を作りなさい。 これがわかりません。そのもこのCの関数?の意味がわかりません。おしえてください

みんなの回答

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.2

> これがわかりません。そのもこのCの関数?の意味がわかりません。おしえてください 普通に考えると、 a,bは積分を行う範囲。 fは、double f(double x)という関数のアドレスを渡すためのポインタです。 例えば、f(x)=x f(x) │    / │  / │/ ┼────x という関数、 double f(double x){return x}; を作っておいて、 Simpson(0.0, 1.0, &f);→0.5を返す。↑のグラフ0~1の面積 Simpson(1.0, 2.0, &f);→1.5を返す。↑のグラフ1~2の面積 Simpson(0.0, 2.0, &f);→2.0を返す。↑のグラフ0~2の面積 となるように、 double Simpson(double a,double b,double (*f)(double)) {   ほげほげ } の「ほげほげ」部分を作りなさいって事です。

daimaounari
質問者

お礼

なるほど、なんかわかってきました。本当に本当にどうもありがとう

  • GRIGO
  • ベストアンサー率15% (9/57)
回答No.1

Simpsonという関数を作れ…という課題では? おそらくその解答…というか、そのページ見てこの課題を出したのだなとおもえるURLも発見しましたが、”課題”ということなので、書きません。

daimaounari
質問者

お礼

貴重な意見どうもありがとうございます。本当にそのさいと教えていただけませんか?友達留年しそうなので救ってあげたいです。ちゃんと考えさせますから、お願いです

daimaounari
質問者

補足

本当ですか? 僕の友達の課題で聞かれたのですが良くわからなくて聞きました。そのサイトおしえて~お願い(^0^) 友達にはすぐおしえないから

関連するQ&A

  • 大学の宿題でfortranをつかったものがあるんですがわかりません><簡単なものでいいんでどなたかおねがいします>

    大学の宿題でfortarnを使ったものがあるんですがわかりません>< 簡単なプログラミングでいいので親切な方作ってください>< 問題は↓です^^ 関数 f(x) = (1+x2)/(1+x4) を区間 [0,1] 上で積分した結果を出力するプログラムを作成せよ。 但し、積分関数を文関数で定義すること。尚、文関数については5回目に説明されている

  • FORTRANをご存じの方がいらっしゃいましたら、間違いを指摘していただきたいです。

    大学で現在FORTRANのシンプソン公式の課題が出ています。 自分で考えて下記プログラムを作ったのですが、どうしても 正しい答えが出力されません。 正しい答えとしては、分割数4とか5とかで πに限りなく近い値になるそうです。 (下に添付した物は、分割数を4にしています。) もしFORTRANをご存じの方がいらっしゃいましたら どこがどのように間違っているのか、ご指摘いただけないでしょうか? よろしくお願いいたします。 問題 4/(1+x^2)を、積分範囲:0~1 を、シンプソン公式を使って求めよ。 区間分割数については、各自適当に与え 分割数が多くなると精度が良くなる事を確認せよ。 シンプソン公式を使うと台形公式を使う場合より 少ない分割数で解(=π)に近づくか確認せよ。 ***ここから*** c numerical value integral c trapezoid formula c *** main program *** real a,b parameter (n=4) a=0 b=1 call simpson(a,b,n,sumf) write(*,*) 'sumf=',sumf end c *** end of main program *** c *** sub program *** subroutine simpson(a,b,n,sumf) dimension f(1000) m=2*n h=(b-a)/float(m) do 10 i=1,m+1 x=a+h*float(i-1) f(i)=func(x) 10 continue sumf=h/3.0*(f(1)+f(m+1)+4*f(m)) do 20 i=2,m sumf=sumf+4.0*(h/3)*f(2*i+1) 20 continue do 30 i=2,m sumf=sumf+2.0*(h/3)*f(2*i) 30 continue end c *** end of sub program *** c *** function sub program *** function func(x) func=4.0/(1.0+x**2) return end c *** end of function sub program *** ***ここまで*** もしお分かりになる方がいらっしゃいましたら、 お手数ですがご指導いただけないでしょうか? お願いいたします。

  • 数値積分

    数値積分で e^(-x)/√xを[0,1]の範囲で数値積分するのですが、 f(0)の値が無限になり、台形公式やシンプソンの公式が使えません。 この場合どのように解けばよいんですか?

  • 関数の積分を求めるプログラムで質問です。

    シンプソンの公式を用いて積分を求めるプログラムで、 「 y=1/(1+x*x) のように±∞で0に収束するような関数は以下のような無限積分を求めることができる。 ∫(-∞→∞){1/(1+x*x)}dx …(a) ただし、無限区間を分割することはできないので、コンピュータを用いた計算では ∫(-a→a){1/(1+x*x)}dx のaに大きな値を入れることで代用する。この積分を求めるプログラムをシンプソンの式を用いて作成し、以下の3ケースについて値を求めて真値と比較せよ。真値は式(a)を解析的に積分することで求めよ。 ・a=100、N=1000 ・a=100、N=500 ・a=200、N=1000 (Nは以下のプログラムと対応しているものです) 」 というもので参考としてS=∫(1→2){1/x}dxをシンプソンの公式を使い求めるものは以下のものなのですが #include <stdio.h> double f(double x) { return 1/x; } int main() { int i,N; double a,b,h,S; double x[1000],y[1000]; a=1.0; b=2.0; N=10; h=(b-a)/N; for(i=0;i<=N;i++) x[i]=a+i*h; y[0]=f(x[0]); y[N]=f(x[N]); S=h*(y[0]+y[N])/3.0; for(i=1;i<=N-1;i=i+2) { y[i]=f(x[i]); S=S+h*y[i]*4.0/3.0; } for(i=2;i<=N-2;i=i+2) { y[i]=f(x[i]); S=S+h*y[i]*2.0/3.0; } printf("N=%d,S=%15.10lf\n",N,S); } これを生かしてプリグラムをつくりたいのですが、分からなくて困っています。助けてください。

  • 数値解析の問題

    質問させていただきます 次の積分の数値積分を考える I=∫[B→A] f(x)dx [A.B}をn分割して、xの分点をとる、即ち xi=A+ih i=0,1,・・・n h=(B-A)/n n=6の場合、台形公式とシンプソンの1/3公式より Iの近似値を求めよ 但し、xi, fi=f(xi), hを用いてあらわせ 台形公式 I=h(f0+f2n)+2h{(f2+f4+・・・・f(2n-2)} シンプソンの公式 I=h/3{f0+f2n+2(f2+f4+・・・・・+f(2n-2)+4(f1+f3++・・・+f(2n-1)} 公式そのまま書いてみたのですが、あってるかどうか分かりません・・・ xiとかも使ってないし・・・ 詳しいかた回答お願いします

  • シンプソン法の出力結果について

    シンプソン法の区間分割数nを10~100まで10ずつ増やして計算値と計算誤差を求めるプログラムを書きに作成したのですが、出力結果に-7.341865999405491E-5などとあります。この「E-数字」とはJavaではどういうこと示しているのですか? また、計算誤差の求め方は下記のプログラムでいいのですか? public class Simpson { static double f(double x) { // ここに任意の被積分関数を記述 double y = Math.exp(- x * x / 2) / Math.sqrt(2.0 * Math.PI); return y; } public static void main(String[] args) { double a = - 1.0, b = 1.0; // 積分範囲 int n = 100; // 区間分割数 for(n=10; n <=100; n+=10){ double h = (b - a) / (double)n; // 分割幅 double s, s1 = 0.0, s2 = 0.0; for (int i = 1; i <= n / 2; i++) { s1 += f(a + (2 * i - 1) * h); } for (int i = 1; i <= n / 2 - 1; i++) { s2 += f(a + 2 * i * h); } s = h / 3.0 * (f(a) + 4.0 * s1 + 2.0 * s2 + f(b)); double suti = (s-0.68269)/0.68269*100;  //計算誤差=(計算値ー真値)/真                                         値×100 System.out.println("区間分割数 =" + n); System.out.println("シンプソン法による計算値 =" + s); System.out.println("シンプソン法による計算誤差 ="+suti+"\n"); } } }

  • シンプソン則について

    大学の課題で ∫0~5 e^(-3t) * cos^2 *(2t) をシンプソン則を用いて求めるプログラムを作成せよ。積分の刻みは0.01毎  という課題がでました。 私は授業で作ったプログラムを元に、以下のプログラムを作ったのですが、答えが大きすぎて(5より大きいと間違いと言っていました)受け取ってもらえません。どこがいけないのでしょうか? あと、nには どのような数字をいれればよいのでしょうか?nは使わないのでしょうか。 お願いします。 #include "stdio.h" #include "math.h" void main() { int n; double i, a, b, h, S, S1, S2, S3; double f (double); a = 0.; b = 5.; printf ("N="); scanf ("%d", &n); h = (b - a) / (double)n; S1 = 0.; S2 = 0.; S3 = f (a) + f (b); /* 両端の値*/ /* 奇数番目の値*/ for (i = 0.01; i < 5; i = i + 0.02) { S1 = S1 + 4. * (f (a + (double)i * h)); } /* 偶数番目の値*/ for (i = 0.0; i < 5; i = i + 0.02) { S2 = S2 + 2. * (f (a + (double)i * h)); } S = (h / 3.) * (S1 + S2 + S3); printf ("%d %lf\n", n, S); } double f (double t) { double y; y = (exp(-3. * t) / 2.) + ((exp(-3.* t) * cos(4. * t)) / 2.); return y; }

  • 関数を引数とする方法?

    いつもお世話になっています。 MFCでプログラムをしています。 今、任意の関数(Func1)を 積分する関数(Func2)を作っています。 現在は、被積分関数の数だけ、 積分関数(Func2)を書いているのですが、 非効率的なので、なるべく汎用性を持たせたいと 考えています。 参考書(新C言語入門シニア編)の該当個所で、 クラスでない通常の関数を引数とする場合は、 うまくいったのですが、 クラスのメンバ関数を引数とした場合、 どうしてもコンパイルエラーが 発生してしまいます。 関数Func、I及びエラーメッセージは大凡次のとおりです。今のところ、引数とする関数(Func1)の引数は、 同一個数としています。 <被積分関数の例> double ClassA::Func1 (double a){ return a * 10; } <積分関数> double ClassA::Func2 (double (*f)(double), double a, double b){ return b * f(a); } void classA::Integration() { ... Func2(Func1,a,b); ... } <エラーメッセージ> classA::Integrationの呼び出し箇所で、 「1番目の引数を double(double)からdouble(__cdecl)(double)に 変換できません」 と出ます。 double(double)の部分は合っているようなのですが、 (__cdecl)の部分が違うということまでは 分かりました。 メンバ関数であることが原因のようなので、 Func2での引数宣言を double ClassA::Func2 (double (ClassA::*f)(double), double a, double b){ return b * f(a); } に変えてみたところ、 引数受け渡しのところはクリアするのですが、 Func2(Func1,a,b); の呼び出し時に、Func2が関数ではないという エラーがでます。 アドバイス又は参考URL等を 教えていただければ助かります。 よろしくお願いします。

  • 複素関数について

    自分は大学で複素関数を習っています。 コーシーの積分の定理でわからないことがあります。 Cの範囲が0~2πのときは∳f(z)=0となるのはわかるのですが、Cの範囲が0~πになったり、 0~π/2になったりするとまったくわかりません。 こういったときはどうやって積分の値を出せばよいのでしょうか? 例などもあるとうれしいです。 よろしくお願いします。

  • コーシーの積分公式について質問です

    コーシーの積分公式を用いて下式の関数の閉曲線(C: lzl=2)に沿う積分の値はどうなりますか?