質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1783閲覧

積分区間を求めるには?

lack_un

総合スコア58

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/06/19 12:04

###前提・実現したいこと
積分区間をプログラミングで求めたい。
0,a-2がゼロになるときのaを求めるには。
なお、0<a<10とする。

###発生している問題・エラーメッセージ

実装方法がわからない。

###該当のソースコード

C

1#include <stdio.h> 2#include <math.h> 3double Answer(); 4double f(double x); 5 6int main(){ 7 8 9 double s; 10 11 12 13 s = Answer(); 14 15 printf("aの答えは%fです。",s); 16 17 return 0; 18} 19 20double Answer(){ 21 double a,x,sum,h; 22 int num,b,i; 23 b=0; 24 h=0.0001; 25 26 num=(a-b)/h; 27 28 for(i=0; i<num; i=i+2){ 29 x=b + h*i; 30 sum = sum + (f(x)+4*f(x+h)+f(x+2*h))/3*h; 31 } 32 33 return sum; 34 35 36} 37 38 39double f(double x){ 40 41 double y; 42 43 y = (1.0 / 1.0 + sin(x/2.0)); 44 45 return y; 46} 47

###試したこと
手計算でやるならばaを適当においておいてからaについての方程式として解くと思うのですが、プログラミングで表現する方法がわかりません。乱数でやるには時間がかかりすぎると思われるし、aをちょっとずつ0<a<10で変化させるにしても、a+0.001などは誤差が生まれるため、分からないです。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

こんにちは。

a+0.001などは誤差が生まれるため

数値計算には誤差が必ず伴います。数値積分も例外ではないです。

私は数値計算には詳しくないので把握していませんが、誤差を一定範囲内に抑えるための理論もある筈です。
数値計算入門 その2に解説がありました。

投稿2016/06/20 00:45

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

... 手計算でやるならばaを適当においておいてからaについての方程式として解く ...

では、まず その方法を日本語と数式で提示してみてください。
話はそれからです。

手動でできないことをプログラムコードに落とす事はできません。
方程式をプログラミングで解く方法は、すでに確立されています。
(宇宙ロケットを飛ばせるのは物理的な方程式をコンピュータで解けているからです。乱数をつかってシュミレートしているわけではありません)

投稿2016/06/19 12:21

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lack_un

2016/06/19 21:31

x/2=tとおくと、(1/2)*∫[0,a/2](1/1+sint)dtとなるので、あとはこれを解くと1/2*{(tan(a/2)-1/cos(a/2) -1}が2と等しくなるので、tan(a/2)-1/cos(a/2)=5となり、cos(a/2)で分母を払えばsin(a/2)-1 =5cos(a/2)、左辺に移行して合成の公式から√26sin(a/2+α)=1(αはcosα=1/√26,sinα=-5/√26を満たす)を満たすようなa/2を出せばいい...となりましたが、これも解を自分で出すところまではいけてないですね..
katoy

2016/06/20 12:49

cosα=1/√26,sinα=-5/√26 までくれば、 α = arccos(1/√26), arcsin(-5/√26) で解けたことになるのでは?
guest

0

自己解決

解を出す二分法と積分を使用することで解けました。
ありがとうございます。

投稿2016/06/20 07:37

lack_un

総合スコア58

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問