ページ 11

シンプソン公式

Posted: 2019年6月19日(水) 19:03
by yasuhiro
楕円x^2/9+y^2/4=1を用いてシンプソンの公式を用いてπの値を求める問題なんですが刻み0.1として
どうしたらいいか全然わからないので教えて欲しいです><
一様台形の場合
#include<stdio.h>
#include<math.h>

int main(void){
double dean(double,double,double,double);
double a,b,s,dx,y0,y1,x,pi;
x=0;
dx=0.1;
s=0;
a=3;
b=2;
y0=dean(a,b,x,dx);
x=dx;
while(x<a){
y1=dean(a,b,x,dx);
s=s+(y1+y0)/2;
y0=y1;
x=x+dx;
}
pi=4*s/6;
printf("π=%lf\n",pi);

return 0;
}
double dean(double a,double b,double x,double dx){
double y;
y=b/a*sqrt(a*a-x*x)*dx;
return y;
}

Re: シンプソン公式

Posted: 2019年6月20日(木) 01:26
by box
どうしたらいいか全然わからないので教えて欲しいです
では、手始めに、各関数や変数がどういう役割を持っているか(何のための関数か
あるいは何のための変数か)をわかる範囲でいいから教えてください。

コード:

int main(void){
double dean(double,double,double,double);
double a,b,s,dx,y0,y1,x,pi;
こんなところにプロトタイプ宣言を置いちゃっていいんでしょうか。

Re: シンプソン公式

Posted: 2019年6月20日(木) 08:02
by yasuhiro
正直シンプソンの公式もプログラムも全然分かってなくて困っているんですよね、

Re: シンプソン公式

Posted: 2019年6月20日(木) 21:47
by みけCAT
box さんが書きました:
3ヶ月前

コード:

int main(void){
double dean(double,double,double,double);
double a,b,s,dx,y0,y1,x,pi;
こんなところにプロトタイプ宣言を置いちゃっていいんでしょうか。
怒られや減点が発生したりコーディング規約違反になったりするかはわかりませんが、
文法・意味的には全く問題ないはずです。

Re: シンプソン公式

Posted: 2019年6月21日(金) 19:21
by かずま
yasuhiro さんが書きました:
3ヶ月前
double dean(double,double,double,double);
dean とは楕円のことですか?

dx = 0.1 だと、x が 0.0 から 3.0 までの 30分割ですが、
それだと十分な精度を持った円周率は求まりません。

コード:

#include <stdio.h>
#include <math.h>

double f(double a, double b, double x)
{
	double d = a * a - x * x;
	if (d < 0) d = 0;
	return b / a * sqrt(d);
}

int main(void)
{
	int n = 8192; // int n = 30; // x: 0.0 -> 3.0, dx = 0.1
	double a = 3, b = 2, dx = a / n;
	double x = 0, y0 = f(a, b, x), y1, y2, pi, s = 0;
	for (int i = 1; i < n; i += 2) {
		x = dx * i;
		y1 = f(a, b, x);
		y2 = f(a, b, x + dx);
		s += y0 + 4 * y1 + y2;
		y0 = y2;
	}
	pi = s / 6 * (2 * dx) * 4 / (a * b);
	printf("π = %f\n", pi);
	return 0;
}
ソースコードを貼り付ける場合は codeタグを使うとか、
複数の掲示板で質問するときは、そのことを書くとか、
フォーラム(掲示板)ルールにしたがってください。
そうすれば、コードの解説をします。

Re: シンプソン公式

Posted: 2019年6月21日(金) 19:58
by かずま
box さんが書きました:
3ヶ月前
こんなところにプロトタイプ宣言を置いちゃっていいんでしょうか。
Kernighan & Ritchie の The C Programming Language
p.72 に次のような例があります。

コード:

	main()
	{
		double sum, atof(char []);
		char line[MAXLINE];
		int getline(char line[], int max);

Re: シンプソン公式

Posted: 2019年6月21日(金) 20:12
by Math
ちなみに台形則の計算結果は円周率にほど遠いね

VS2019 Communityss使用
http://www2.koyoen.birdview.co.jp/~abcx ... -22-a-.PNG

Re: シンプソン公式

Posted: 2019年6月21日(金) 20:21
by Math
しかしここまでできているのだから刻みをdx=0.001くらいにして

ここhttps://keisan.casio.jp/exec/system/1503541086を参照すれば簡単だよ。

https://ja.wikipedia.org/wiki/%E3%82%B7 ... C%E5%BC%8F
も参照

Re: シンプソン公式

Posted: 2019年6月21日(金) 20:33
by Math
台形則でも 刻みを dx=0.001 にしただけで

π=3.141585

と改善されたぞ(^^;