こんにちは<_ _>
毎度もうしわけありません・・・
exp(x)をテイラー展開を用いて計算せよという問題で
-----------------------外を与えられ
サイトなどを見て見よう見まねで-----内を組んでみましたが
当然思い通りになるわけでもなく;;
テイラー展開という考え方は1.00007の何乗を1と.00007分に分けて
計算するというものであるという認識です。
(そもそも言葉自体始めて見て、サイトで調べてみたもので
あっているかどうかも・・・)
以下の結果
「 x myexp(x) exp(x)
0.0 1 1
10.0 110123 22026.5
20.0 4.85165e+009 4.85165e+008
30.0 1.60297e+014 1.06865e+013
40.0 4.70771e+018 2.35385e+017」
こうなりましたが、期待の結果はexpとmyexpの結果が
同じものにならなければいけないみたいです・・・
テイラー展開の補足とヒントでもいいので
プログラムの組み方を教えてください<_ _>
おねがいします<_ _>
#include<stdio.h>
#include<math.h>
double myexp(double);
int main(void)
{
double x;
printf(" x myexp(x) exp(x)\n");
for(x=0;x<=40;x=x+10)
printf("%5.1f%14.6g%14.6g\n",x,myexp(x),exp(x));
}
double myexp(double x)
{
double EPS=1e-08;
double s=1.0,e=1.0,d=1.0,diff;
int k;
-----------------------------------
d=x*x;
k=2;
while (1){
x = x*d;
s *= (k-1)*k;
k += 2;
diff = x/s; /* n項目の値 */
e += diff;
if (fabs(diff) < EPS){
break;
}
}
return e;
------------------------------
}
No.5ベストアンサー
- 回答日時:
> 理数系はあまり勉強してませんでした。
>
> 問題は新卒研修の提出問題で
> その問題を解いている段階です・・・
あらまそれは大変ですね。
わたしはテイラー展開(マクローリン展開)は大学の
情報関係の講義でやったので、純粋な文系だとやらないかもしれませんね。
提出問題だということなのでもうちょっと悩んでもらうとして、
テイラー展開ってのは何かというと、
ある式(今回の問題だと e^x ですね)を、ちょっと単純にした式の総和にするということです。
で、この「単純にする」のに微分を使います。
ある式 f(x) があったときに、
f'(x) (f(x)を一回微分したもの) +
f''(x) (f'(x)をさらに一回微分したもの)+
f'''(x) (f''(x) をさらにもう一回微分したもの) …
と、微分をし続けながらそれらの合計により元の式の値(の近似)が求まるわけです。
元の式によって何回微分ができるとか、どのくらいの精度で近似を求めるとか
ありますが、今回の e^x は何回でも微分できますので、
単純にどこまで細かくするかの問題になります。
で、e^x をテイラー展開するとWikipediaにもあるような式になります。
#なんで、というのは数学カテゴリでお訊きください。
#わたしにはわかりやすく説明できる自信がありません。
で、それをプログラムで書くと
#2の方の回答にある
myexp( x ) = 1 + x + (x^2/2!) + (x^3/3!) + (x^4/4!) + ....... + (x^n/n!)
になります。
大まかに書くと
n=0
合計=0
while (1) {
1. nの階乗を求める(n!)
2. xのn乗を求める(x^n → pow(x, n))
1. / 2. の値を求める
1. / 2. が十分小さかったらループから抜ける
合計に1. / 2. を足す
n を1増やす
}
こんな感じです。
ちょっとサービスしすぎたような気がしないでもないですが、乗り切ってください。
No.6
- 回答日時:
締め切りによっては本なんか読んでいるひまもないかもしれませんが、
図解入門 よくわかる微分積分の基本と仕組み
http://www.cbook24.com/bm_detail.asp?sku=4798010 …
この本なんかは理解の取っ掛かりになるかもしれません。
#でもAmazonのレビューで点数良くないな…
あと、#5での説明はわかりやすくしようとして
正確にでない説明になっているところがあるかもしれないので、
気になるようでしたらやはりその方面の資料を
一回あたっておくことをお勧めします。
今月末ぐらいなら結城浩さんの新刊が出る予定なので
それを勧めるのですが。
#ちょうど関連する分野の本です
No.4
- 回答日時:
★アドバイス
・『テイラー展開』よりも『マクローリン展開』で検索した方が良いかもしれませんよ。
あと『科学技術計算』をキーワードで検索します。
すると
http://www5.airnet.ne.jp/tomy/cpro/csource.htm→『技術計算用Cプログラム ソース』
というサイトが発見できます。
こちらのサイトは私も以前から参考にさせてもらっていたサイトです。
2000年~2001年の時にお世話になりました。
バグが一部あるとその後に書かれていましたが、今見たら消えています。
多分直したのかもしれません。未確認ですが。
・それでこのサイトの
http://www5.airnet.ne.jp/tomy/cpro/mp8.htm→『MPAライブラリ 指数・対数・べき乗関数ルーチン』
が参考になりませんかね。
記述はこのサイトで紹介している多倍長演算の関数群で書かれているので <math.h> にある
算術関数に置き換えれば良いでしょう。
・下の『参考URL』にマクローリン展開の分かりやすいサイトを張っておきます。
『指数関数のマクローリン展開』にある数式を C 言語を用いてループで記述すれば出来ます。
・以上。
参考URL:http://assam.cims.hokudai.ac.jp/~josch/workshop/ …
No.3
- 回答日時:
質問者さんの年齢や学歴が分かりませんが...
ご自身でも書かれているように、やはり数学を復習した方が近道だと思います。このまま強引にすすめても、指数関数はできても三角関数だとできないということになりそうです。
テイラー展開そのものは高校では習わなかった気がしますが、級数や微分なら(普通科や工業科の)高卒程度の学力で理解できるはずです。そこを確実に押さえておけば、テイラー展開の説明を読めば難しくないでしょう。
当方大卒の新社員です。大学は私立文系で
高校は理数科でしたが、転向して文系にいくことを決めていたので
理数系はあまり勉強してませんでした。
問題は新卒研修の提出問題で
その問題を解いている段階です・・・
No.2
- 回答日時:
私も検索してWikipediaのページを見ましたが?でした
http://assam.cims.hokudai.ac.jp/~josch/workshop/ …
をみてようやくマクローリン展開は理解できたつもりです。
質問の関数ですがWikipediaにも書いてある指数関数のテイラー展開から
myexp( x ) = 1 + x + (x^2/2!) + (x^3/3!) + (x^4/4!) + ....... + (x^n/n!)
をCで書けばよいようです。
実際は無限回続きますが n > xになると(x^n/n!)はしだいに小さくなるので(x^n/n!)がEPS=1e-08以下になった時点でループを抜ければよさそうです。
No.1
- 回答日時:
テイラー展開をキーワードにGoogleで検索すると
Wikipediaのページがトップにくると思うんですが、
そこをみて
> テイラー展開という考え方は1.00007の何乗を1と.00007分に分けて
> 計算するというものであるという認識です。
と思われたわけではないですよね?
少なくとも今回はそのとらえ方は違います。
そして、myexpの中身が間違っています。
テイラー展開 - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%86%E3%82%A4% …
の指数関数と自然対数のところにある式を素直に使えばいいんじゃないでしょうか。
スピードだのなんだのは正しい答えが求まるようになってから。
myexpを適当に書き直したところ
x myexp(x) exp(x)
0.0 1 1
10.0 22026.5 22026.5
20.0 4.85165e+008 4.85165e+008
30.0 1.06865e+013 1.06865e+013
40.0 2.35385e+017 2.35385e+017
こんな感じになりました。
解答ありがとうございます<_ _>
私は
http://www.tohtech.ac.jp/~comms/nakagawa/taylore …
を参考に見ていました。
wikiのもみましたが数式が読み取れず言葉も難しくて・・・orz
数学を勉強するところから始めたほうがいいのでしょうか・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C++で外積
-
至急です! マクロ定義で #defi...
-
先程の質問で教えていただき、...
-
C言語
-
C言語を実行すると-infが出てき...
-
(C言語)ニュートン法のプログ...
-
Cで3乗根を求める方法
-
C言語 関数プロトタイプ宣言の...
-
float型とdouble型の変数の違い...
-
C#、太らせた多角形を塗りつぶ...
-
はさみうち法のプログラム(C言...
-
-1.#IND00と出てしまうのですが...
-
数値を指数部と仮数部に分離したい
-
2つの式
-
1以上の自然数を2つ(それぞれ...
-
急!【ヒストグラムのプログラ...
-
C言語でのsinxのマクローリン展...
-
vc++expreeで作ったdllをvbaで使用
-
3次方程式の求解プログラム(...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
C言語 関数プロトタイプ宣言の...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
関数におけるif文とreturn文に...
-
c言語のプログラミングについて...
-
2分法で方程式の複数の解を自...
-
-1.#IND00と出てしまうのですが...
-
doubleは常に%lfとするべきなのか
-
C言語のpow関数の不具合
-
C言語で-23乗を取り扱うには
-
C言語で台形公式を使った二重積...
-
Cで3乗根を求める方法
-
2次方程式の解を求めるプログ...
-
sin(x)の近似について
おすすめ情報