• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:台形公式)

台形公式を使用して定積分を計算する方法

このQ&Aのポイント
  • C言語初心者の方が、指定の関数の定積分を計算するために台形公式を使用するプログラムを作成していますが、コンパイルエラーが発生しています。
  • プログラムのエラーメッセージを解説し、正しい構文に修正する方法について教えてください。
  • 台形公式による定積分の計算の手順と、C言語での実装方法についても教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#157743
noname#157743
回答No.1

まず、C言語の文法上のミスと誤りから。エラーはこれが原因で出てます。 <<7行目のエラーの原因>> int N,n ←この行の最後に ; が抜けています。 <<14,15行目のエラーの原因(19,20行目も同様)>> while(n=0;n<=N;n++) ←whileの引数に取れるのは条件式1つだけです。(n=0;n<=N;n++)という書式の引数を取れるのはforです。 と、これで文法的なエラーは出なくなるはずですが、おそらく正しい結果は得られません。台形公式の解釈が間違っていると思いますので、それは公式の意味をもう一度よく考えてみてください。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

noname#157743
noname#157743
回答No.6

>z-2-2.c(16) : error C2198: 'exp' : 呼び出しに対する引数が少なすぎます。 >とあるのですが、これは何が原因なのでしょうか? exp(t[n]) の中の t[n] がエラーになって値が定まらなくなったので、exp() となって、() の中にあるべき引数がないと言っているんでしょう。

moriyou
質問者

お礼

わかりました! 2日にわたり、ご解答ありがとうございました。 おかげで、新たな知識を身につけることができました。 またご縁があったらよろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
noname#157743
noname#157743
回答No.5

いやいや、宣言の時にdoubleにしてはいけません。1/Nを計算する時に「キャスト」するんです。キャストってわかりませんか? 日本語で言うと「型変換」です。教科書調べてみてください。 ちなみに、簡易的な方法としては「1/N」を「1.0/N」とすれば、暗黙のキャストが実行されて問題は解決する…と思いますが、どうしてそうなるのかを理解するためにキャストとはどういうことかをきちんと調べてみてください。

moriyou
質問者

補足

いきました! ありがとうございます。 最後にひとつ質問したいのですが、 キャストする前に(#4補足)出てきたエラーの中に、 z-2-2.c(16) : error C2198: 'exp' : 呼び出しに対する引数が少なすぎます。 とあるのですが、これは何が原因なのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
noname#157743
noname#157743
回答No.4

なるほど。わかりました。 d=1/N; この計算の右辺は「1」も「N」もint型なので計算はintで行われます。すると、N>1の時、計算結果の小数点以下は切り捨てられるので、答えは「0」になります。その後、dへの代入のためにdoubleにキャストされるので、dの値は0.000000になってしまいます。 この状態を解消するには、割り算が実行される前の「1」と「N」を明示的にdouble型にキャストしてあげればいいということになります。

moriyou
質問者

補足

連絡遅くなってしまって申し訳ありません。 n,Nをそれぞれ、doubleにしましたが、以下のようなエラーが出てきてしまいました。 z-2-2.c z-2-2.c(15) : error C2108: 添字に整数でない型が使われました。 z-2-2.c(16) : error C2108: 添字に整数でない型が使われました。 z-2-2.c(16) : error C2108: 添字に整数でない型が使われました。 z-2-2.c(16) : error C2198: 'exp' : 呼び出しに対する引数が少なすぎます。 z-2-2.c(20) : error C2108: 添字に整数でない型が使われました。 z-2-2.c(23) : error C2108: 添字に整数でない型が使われました。 z-2-2.c(26) : error C2108: 添字に整数でない型が使われました。 z-2-2.c(27) : error C2108: 添字に整数でない型が使われました。

全文を見る
すると、全ての回答が全文表示されます。
noname#157743
noname#157743
回答No.3

えーと、ちょっとすぐにはどこがおかしいかピンと来ないのですが、このような場合、途中の計算結果を全て出力させてみてどこがおかしいのかを探るのが得策です。 計算で求めているd,t[n],f[n],sの値を全部出力させて、値を見て考えてみてください。

moriyou
質問者

補足

N=1,2,3の場合について出力させてみたところ、このようになりました。dの値すら0.000000となっているのはなぜでしょうか? N=1 d=1.000000 t[n]=1.000000 f[n]=2.718282 s=0.000000 mennseki=1.859141 N=2 d=0.000000 t[n]=0.000000 f[n]=1.000000 s=1.000000 mennseki=0.000000 N=3 d=0.000000 t[n]=0.000000 f[n]=1.000000 s=2.000000 mennseki=0.000000

全文を見る
すると、全ての回答が全文表示されます。
noname#157743
noname#157743
回答No.2

すみません。訂正。 もう一度見直したところ、台形公式の実装はこれで正しそうです。

moriyou
質問者

補足

早速解答をしていただき、ありがとうございます。 エラーメッセージは取れましたが、N=1では値がしっかり出るのですが、そうでないときには0.000000になってしまいます。 これはどう対処すればよいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 台形公式について

    台形公式を使って、2*sqrt(1-x*x)の-1から1の積分の近似値を求めようと思うのですが、結果が違う気がします。おかしなところがありますか?また、皆さんの結果ではどういった結果が出てきますか? 台形公式のプログラムリスト double daikei(double N){ int k; double y,S,sum; sum = 0.0; for(k=0; k<=N; k++){ y = 4.0 * sqrt((k/N)*(1.0+(k/N))); if(k==0 , k==N){ S = (1.0/N) * y; } else { S = (2.0/N) * y; } sum = sum + S; } return sum; }

  • Re(s)>1,{1/n^s}が広義一様収束?

    Re(s)>1, f_n(s):=1/n^sの時, 関数列{f_n(s)}が広義一様収束 となる事を示したしたいのですが どのようにすれば示せますでしょうか? 一応,広義一様収束の定義は 「D⊂C, f_n,f:D→Cとする。{f_n}がfにD上広義一様収束する ⇔ ∀D'∈{D';D⊃D'は有界閉集合}, lim_{n→∞}sup{|f_n(z)-f(z)|∈R;z∈D'}=0」 だと思います。

  • 台形公式・シンプソン公式についての質問

    以前質問させていただき実際にプログラミングを作ったのですが、なぜか間違った答えが出てしまいます。 区分求積法・台形公式・シンプソンの公式を用いて、1/1+x*xを求めたいのですが、 1)台形公式の答えが区分求積法の答えより精度がが悪くなってしまう。 2)シンプソン公式が答えに収束しない。 となってしまいます。 以下がそのプログラム↓ #include <stdio.h> #define FROM 0.0 #define TO 1.0 double func(double x) { double out; out = 1.0 / ( 1.0 + x * x ); return (out); } double kubun(double start, double end, int num) { int i; double h, s; h = ( end - start ) / num; s = 0.0; for(i=0; i<num; i++) s += func( start + i * h + h / 2.0 ); return ( s * h ); } double daikei(double start,double end,int num) { int i; double h,s; h = ( end - start ) / num; s = 0.0; for(i=1; i<num-1; i++) s += func( start + i * h ); return ((func(start) / 2.0 + s + func(end) / 2.0) * h ); } double simpson(double start,double end,int num) { int i; double h,s; h = ( end - start ) / num; s = 0.0; for(i=1;i<num;i+=2) s += 4.0 * func(start + h * i); for(i=2;i<num;i+=2) s += 2.0 * func(start + h * i); return ( (func(start) + s + func(end))/ 3 ); } int main() { double func(double); double kubun(double, double, int); double daikei(double, double, int); double simpson(double, double, int); printf("\n"); printf("### Square Integration\n"); printf(" ++ Partition = 10\t Answer = %10.6f\n", kubun(FROM, TO, 10)); printf(" ++ Partition = 50\t Answer = %10.6f\n", kubun(FROM, TO, 50)); printf("\n"); printf("### daikei Integration\n"); printf(" ++ Partition = 10\t Answer = %10.6f\n", daikei(FROM, TO, 10)); printf(" ++ Partition = 50\t Answer = %10.6f\n", daikei(FROM, TO, 50)); printf("\n"); printf("### simpson Integration\n"); printf(" ++ Partition = 10\t Answer = %10.6f\n", simpson(FROM, TO, 10)); printf(" ++ Partition = 50\t Answer = %10.6f\n", simpson(FROM, TO, 50)); return (0); } 画面に表示する際に、それぞれ分割数を10と50にした際の値を表示するように作りました。 細かい点までご指摘いただけると幸いです。 よろしくお願いします。

  • 台形波のフーリエ級数

    台形波のフーリエ級数の問題です。写真の台形波のフーリエ級数を計算してみたのですが、これであっていますでしょうか?もし間違っていたら指摘してください!!回答よろしくお願いします。   f(t)=(Vm/α)t (0<=t<=α)   f(t)=Vm (α<=t<=π-α) A0=An=0 Bn=1/π∫[2π→0]f(t)(sinnt)dt =1/π×4∫[α→0]f(t)(Vm/α)t(sinnt)dt + 1/π×2∫[π-α→α]Vm(sinnt)dt =(4Vm/πα){-α(cosnα)/n+sinnα/n^2} + (2Vm/π){-cosn(π-α)/n+cosnα/n} =(2Vm/π){2sinnα/n^2α - cosnα/n - cosn(π-α)/n} よって、 f(t)=(2Vm/π)Σ[n=1,∞]{2sin(2n-1)α/(2n-1)^2α - cos(2n-1)α/ (2n-1) - cos(2n-1)(π-     α)/(2n-1)}sin(2n-1)t

  • C言語、半角で打ち直しても多くのエラーメッセージ。

    いつも大変お世話になり、誠にありがとうございます。 標記の件。 下記に、コード、エラーメッセージを書きます。 コンパイルしたところ、多くのエラーメッセージが出ます。 こういうエラーメッセージの場合、誤って、全角で 打ってしまったのだと思い、全部を半角で打ち直します。 デモ、また大量のエラーメッセージが出ます。 全角スペースを半角で打ち直す「コツ」ってありますか? 是非とも教えてください。 ご多忙中のところ、度々申し訳ございません。 下記コードが何故コンパイルエラーを起こすのか どうか、ご回答の程宜しくお願い申し上げます。        記 コード /*文字と数値を出力する*/ #include <stdio.h> int main(void) { printf("%cは文字です。\n",'A'); printf("%dは整数です。\n",123); printf("%fは小数です。\n",10.5); return 0; } エラ-メッセージ C:\MinGW>gcc test1.c -o test1 test1.c:1:1: error: stray '\377' in program test1.c:1:2: error: stray '\376' in program test1.c:1:3: error: expected identifier or '(' before '/' token test1.c:1:4: warning: null character(s) ignored test1.c:1:6: warning: null character(s) ignored test1.c:1:7: error: stray '\207' in program test1.c:1:17: error: stray '\222' in program test1.c:1:19: error: stray '\372' in program test1.c:1:21: error: stray '\233' in program test1.c:1:25: error: stray '\213' in program test1.c:1:28: warning: null character(s) ignored test1.c:1:30: warning: null character(s) ignored test1.c:2:1: warning: null character(s) ignored # i n c l u d e < s t d i o . h > ^ test1.c:3:1: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:3: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:4: error: invalid preprocessing directive #i i n t m a i n ( v o i d ) ^ test1.c:3:5: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:7: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:9: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:11: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:13: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:15: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:17: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:21: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:23: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:25: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:27: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:29: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:31: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:33: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:35: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:37: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:4:1: warning: null character(s) ignored { ^ test1.c:5:1: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:3: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:5: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:7: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:11: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:13: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:15: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:17: warning: null character(s) ignored 全部はコピーできませんでしたが、どうぞ、宜しくお願い申し上げます。

  • 逆z変換

    c * z^-1 / (b - a * z^-1) の逆z変換ですが、下記のような形で合っていますか? 分子・分母に 1/b をかける (c/b) * z^-1 / (1 - (a/b) * z^-1) N(z) = (c/b) * z^-1 と D(z) = 1 / (1 - (a/b) * z^-1) に分けて考える D(z): 変換表 a^n * u0(t) ←→ 1 / (1 - a * z^-1) から、 1 / (1 - (a/b) * z^-1) の逆z変換は、(a/b)^n * u0(t) N(z): 変換表 f[n - 1] ←→ z^-1 * F(z) から、 (c/b) * z^-1 * F(z) の逆z変換は、(c/b) * f[n - 1] N(z) * D(z) = (c * z^-1) * (1 / (b - a * z^-1)) = (c/b) * (a/b)^[n-1] * u0(t) どうぞよろしくおねがいします。

  • 集合と論理

    「f(x)=x^2+ax+b とする。∀n∈Z に対して、f(n)が偶数となるためのa,bの条件を求めよ。」 この問題に対して私は以下のように解答しました。 「(ⅰ)nが偶数 つまりn=2p(p∈Z)と表わせるとき   f(n)=f(2p)=2*2p^2+2ap+b   f(n)が偶数となるとき bが偶数であることが必要  (ⅱ)nが奇数 つまりn=2q+1(q∈Z)と表わせるとき   f(n)=f(2q+1)=2*2q^2+2(a+2)q+a+b+1   f(n)が偶数となるとき a+b+1が偶数であることが必要  (ⅰ),(ⅱ)より   f(n)が∀n∈Z に対して偶数となるとき   aは奇数、bは偶数であることが必要  逆にaは奇数、bは偶数 すなわち a=2s+1(s∈Z), b=2t(t∈Z) であるとき f(x)=x^2+(2s+1)x+2t となり (a)nが偶数 つまりn=2p(p∈Z)と表わせるとき f(n)=2*2p^2+2p(2s+1)+2t となり f(n)は偶数  (b)nが奇数 つまりn=2q+1(q∈Z)と表わせるとき f(n)=2*2q^2+2(2s+3)q+2t+2 となり f(n)は偶数  となるから f(n)は∀n∈Z に対して偶数となる  以上よりn∈Z に対して、f(n)が偶数となるためのa,bの条件は  aが奇数で、bが偶数であること」 設問に対する証明はこれで良いのでしょうか。   

  • ラプラス変換のtのn乗公式についてわからない問題があります。

    ラプラス変換で、 L(t^nf(t))=(-1)^n d^n/ds^n F(s) がありますね。俗に言う像の微分法則の一般形です。 ^nはn乗を意味し、F(s)はf(t)のラプラス変換です。 今回の質問はf(t)がsin(at)またはcos(at)のとき、どうなるかということです。つまり、 L(t^nsin(at))= L(t^ncos(at))= が何かになるということです。 計算していくと、結局は a/(s^2+a^2) および s/(s^2+a^2) のn階微分を求めればいいのですが、これが私はできないのです。どうか知恵を貸してください。

  • 質問:フーリエ級数はどんなとき元の関数に収束するの?

    私の本(岩波)によると e[n](t)≡exp(i・2・π・n・t)とし f(t)=f(t+1)(∀t∈R)とし F[n]≡∫(t∈[0,1])dt・f(t)・e[-n](t)としたとき 「f(t)がC^1級であれば Σ(n∈Z)・F[n]・e[n](t)がf(t)に一様収束する」 とあり 「f(t)が区分的にC^1級であれば Σ(n∈Z)・F[n]・e[n](t)が(f(t-0)+f(t+0))/2に各点収束する」 とありますが (1)「フーリエ級数の一様収束」のもっと緩い条件を教えてください (2)「フーリエ級数の各点収束」のもっと緩い条件を教えてください (1)と(2)のどちらでもいいです

  • xのn乗の微分の公式!!

    参考書に「(定理) xのn乗の微分の公式        (i) f(x)=xのn乗(nは正の整数)のとき         f '(x)=d/dx・xのn乗=n・xのn-1乗        (ii) f(x)=c(cは定数)のとき          f '(x)=d/dx・c=0 ただしx=0の場合を除けば、(ii)は(i)のn=0の場合に含めることもできる。」とかいてあったのですが、「ただし・・」いこうの文がどういういみなのかわかりません。 教えてください!!!おねがいします!!!!