MATLABの使い方

純粋な数学の質問じゃなくて申し訳ないのですが、数学に関することなのでここで質問させていただきました。MATLABを使って以下のことを計算させたいのですが、その入力の仕方を教えてください。
1.以下の近似値を求めよ。
(1)e=lim[n→∞](1+1/n)^n
(2)e=Σ[n=0→∞]1/(n!)
(3)π=4(1-1/3+1/5-1/7+…)
(4)π=4{4(1/5-1/(3・5^3)+1/(5・5^5)-…)-(1/239-1/(3・239^3)+1/(5・239^5)-…)}
 (5)100^(1/9)
(6)5^(-x)=x
2.以下の関数のグラフを表示させる
 (1)e^(-x)・Arctanx (-5≦x≦5)
 (2)x=(t^2-t-3)e^(t)・cost,y=(t^2-5t+1)e^(t)・sint (-1≦t≦10)
MATLABに関してはまったくの初心者なので、できれば入力方法を具体的に示していただければ幸いです。よろしくお願いします。

投稿日時 - 2005-07-12 19:44:31

QNo.1509064

困ってます

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

プログラムが説明から簡単にできるはずです。
例題の解はAnを変更するだけでそのまま解になりますし、1.(1)が書籍からそのまま流用した問題であることから、問題と殆どその解をそのまま回答しますと、マナー違反になりますので、間違ってもご自分で解を作成ください。
また、書籍から例題を拾ってくると、私の方が著作権違反のマナー違反になりますので、#9の回答の補足は無かったものとして扱います。

なお、#9でお書きした評価式は「while 条件式 計算式; end」の条件式として使う場合は不等号の向きが「<」ではなく「>=」となりますのでご注意ください(計算式を使うのが収束前の場合のため)。

投稿日時 - 2005-07-18 02:46:01

お礼

なんとかやり終えることができたので、ありがとうございました。

投稿日時 - 2005-07-18 12:10:52

ANo.10

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(9件中 1~9件目)

ANo.9

#8の補充です。
極限の補足です。
nの値を1ずつ増加していくとき、各項を順に並べると数列ができます。
収束性がよい場合
{A1,A2,...,An,...}あるいは{An}(n=1,...,∞)
when ... endの条件の評価式|An-An-1|<δ
最初の評価式|A2-A1|<δ
収束値(極限値Ao)が既知の場合は|A1-Ao|<δ
に使われますのでAnの計算は最初の評価式で使われるA1または(A1とA2)以降のn=kから計算を始めます(k=2 or 3)。

収束性が悪い場合
{Am,Am+1,...,An,...}あるいは{An}(n=m,...,∞)
when ... endの条件の評価式|An-An-1|<δ
最初の評価式|Am+1-Am|<δ
収束値(極限値Ao)が既知の場合は|Am-Ao|<δ
に使われますのでAnの計算は最初の評価式で使われるAmまたは(AmとAm+1)以降のn=kから計算を始めます(k=m+1 or m+2)。
ここでmの値の初期値をある程度大きな値にします。どの位大きくするかは、極限の値の計算値の有効桁数と数列の収束状況により変わります。目処として、収束状況、つまり計算時間がかかるときはnの初期値をどんどん1000,それでも時間がかかるときは2000,5000,10000,20000,50000,...と初期値を変更してやります。(大きくし過ぎると1回で収束してしまいますのでその場合は逆にnを1つ前の初期値に戻してやります。)

以上のようにすると、求める有効桁数での極限値を求めるためのnの最小値とAoの近似値が求められます。

投稿日時 - 2005-07-17 08:37:06

補足

理論だとわかりにくいので、簡単な関数かなんかで例を示してもらえますか?

投稿日時 - 2005-07-17 20:01:10

ANo.8

>while~endの和の極限のやり方はわかりましたが、単に極限をとる場合がわかりません。
やり方が変わるわけではありません。
評価式のSnやSn-1が
AnとAn-1に変わるだけで、計算式では、sの累積和が Anの項の計算だけになるだけです。

WindowsPCをお使いなら、
デスクトップに表示された画面全体、または個別ウインドウ画面をクリップボードにコピーして、ワードまたはパワーポイントの画面に貼り付けて、やればいいと思います。貼り付け時に図面は縮小すれば一ページに収まるかと思います。
クリップボードへの取り込みは、<Print Screen>キーを押すだけで現在表示されているデスクトップ画面全体が取り込めます。個々のウインドウ画面だけを取り込むには、該当ウインドウ画面をアクティブにしておいて、<Alt>キーを押した状態で<Print Screen>キーを押すだけでアクティブにしてあるウインドウの画面だけを取り込めます。

M-ファイルやCommand Windowの画面は、テキスト形式の表示ですので、ドラックしてコピーか、全部選択してコピーで内容をクリップボードに取り込みワード等に貼り付けて利用できます。

投稿日時 - 2005-07-17 02:48:01

ANo.7

>limit((1+1/n)^n,inf)とやるとexp(1)と出て近似値が出ません。
この実施過程の操作をどのようになさったのかもう少し詳しく書いていただかないと、当方で再現できませんので回答できません。
参考までに、MATLABの倍精度の有効桁数を得るには、nの値は67796503となります。
exp関数の計算でべき乗(指数部)の上限があるかもしれません。exp(Inf)が計算過程で入るとオーバーフローエラーが発生する原因になる可能性があります。
limit()を使わないで、「while ... end」でプログラミングされてはいかがですか?

>M-ファイルで出した結果を入力工過程とともに印刷するのにいい方法はないですか?
質問者さんのMATLABの利用環境(MATLABがUNIX版なのかWindows版なのか、MATLABがサーバ上にインストーされているのか、パソコンにインストールされているのか)、操作環境(MATLABをインストールしたWS/PC上で操作しているのか、X環境のPCからリモートでアクセスしているのか)、どのOSの計算機に接続されたプリンターに印刷するのかなどの情報を書いていただかないと具体的回答ができません。

M-ファイル自体はテキストファイルなので何処でも印刷できると思います。
>入力工過程
これはどのウインドウのことですか?

「Command Window」のウインドウはテキスト形式ですので、表示内容をテキストファイルとして取り出せば印刷可能です。

それともMATLABの各ウィンドウの画面を画像(jpegなど)として取り出し印刷したいのですか?

多分発表用の資料を作るのが目的ですか?
(ここの最初の質問の趣旨を余り逸脱しない範囲でしか回答できませんよ。)

投稿日時 - 2005-07-16 17:39:52

補足

while~endの和の極限のやり方はわかりましたが、単に極限をとる場合がわかりません。
また、使っている環境はwindowsです。別にプレゼンテーションをするわけではないのですが、MATLABの入ってるPCが私のじゃないので自分用にM-ファイルのプログラムとコマンドウィンドウに出た値の両方を一枚の紙に印刷したいんです。

投稿日時 - 2005-07-17 01:18:26

ANo.6

#3の回答で補足された式に括弧の付ける位置の間違いを発見しました。
訂正すれば、N=10でπの値がでてくるようです。
もちろんN=100とすればオーバーフローでNaNとなります。
N=10で良いかどうかの検証はなしですね。
-----------------------------------
format long
a=0; for n=1:N a=a+4*(4*1/((2*n-1)*5^(2*n-1)*(-1)^(n+1))-1/((2*n-1)*239^(2*n-1)*(-1)^(n+1))); end, a
------------------------------------

#5の誤差の評価式は正式には真の収束値Soが既知であればSn-1の代わりのSoを使います。Soが未知の場合にSoの代わりにSn-1で代用することがいうまでもありません。

上記をwhile ... end を使ってM-ファイルに書き換えると以下のようになります。精度(有効桁数)を15桁とした場合の項数Nは偶然にも10になります。
--------------------------------------
format long
a=0;
n=0;
an=4*(4/5-1/239);
while abs(a-pi) >= 1e-14
n=n+1;
an=4*(4*1/((2*n-1)*5^(2*n-1)*(-1)^(n+1))-1/((2*n-1)*239^(2*n-1)*(-1)^(n+1)));
a=a+an;
end
n,a
--------------------------------------

投稿日時 - 2005-07-15 23:03:04

補足

1.(1)についてですが、
limit((1+1/n)^n,inf)とやるとexp(1)と出て近似値が出ません。また、M-ファイルで出した結果を入力工過程とともに印刷するのにいい方法はないですか?

投稿日時 - 2005-07-16 13:58:28

ANo.5

#4の訂正と補足です。
NaNの発生する場合の追加で1.(4)の級数計算でInf(∞)が発生します(MATLABで扱える数値の絶対値の上限を超えた場合)が、∞-∞+∞-∞+....といった計算をしていますので、∞-∞型の計算になりNaNが発生するのです。

M-ファイルのプログラム例中 x=n の行と次の空行は不要です(訂正)。

追加ヒント:
while文の後ろの条件文は
誤差の評価式が入ります。(数値計算における誤差論)
収束値の大きさがほぼ分かっている場合の評価式は
1)|Sn-Sn-1| >= δ (絶対誤差)
収束値が全く分からない場合の評価式は
2)|(Sn-Sn-1)/Sn-1| >= δ (相対誤差)

これらの条件が満たされている限り計算を続けます。
評価式が満たされなくなった時(計算精度まで計算できた時)end へ抜けます。

投稿日時 - 2005-07-15 20:42:08

ANo.4

>極限に関して、もっと具体的な方法をおしえてください。
極限の意味をよく考えましたか?
ただ、nを物凄く多きく、例えば10億、いや100兆,...などと考えては見えないでしょうね。
収束値の何桁まで正しく求めればよいかということ(有効桁数)をまず設定し、その有効桁数まで求められたら(誤差がその有効桁数以下になったら)、1.(2)のnの極限を1000でなく17で十分であるということです。
収束値に対する誤差の評価をしないと、nの最大値をいくつにしたら極限まで計算したといえません。逆に計算機で計算できる最大桁数の有効桁数まで正しく計算できるなら(誤差が有効桁数以下なら)、nの最大値は1000でなくても17で十分ということです。

#3でwhile 条件式 ... end
のプログラム構造を使ってくださいとアドバイスしたのにもかかわらず
for n=1:N ... end
でプログラムしようとされるのですか。
誤差評価の条件式が得られず、無駄な計算をすることになり、得られた結果も何桁まで正しいか分かりませんね。
たまたまeやπの値は他の数学者やプログラマーが求めたものがあるのでよいですが...。
結果が分かっていない収束は、今のようなnの最大値をいたずらに大きくしてもさっぱりどこまでが正しいか分かりません。
MATLABでは、収束条件を設定して何回も繰り返し計算をする方法は、他の言語のようなgoto文やif 条件 goto文がありませんので、「while 条件文 ... end」の構文をを使わないと、何桁まで正しく求めるといった計算のプログラム作成が非常に困難ですよ。

#2と#3で説明しましたM-ファイルによるプログラミングとファイルの実行をする方法をおやりになりましたか?
この方法を使わないとMATLABでのNewton-Lapson法でのプログラムはできませんよ。

>NaNとでました。これはどんな意味ですか?
Not a Numeric という意味を表す表記で数値として表せない(不定)という意味です。0/0や∞/∞などの計算結果がこれにあたります。
5/0はInf(∞の意味)になります。
n=100のとき
239^(2*n-1)がどの位の数値になるか検証されましたか?
2.0007e254となります。MATLABではオーバーフローする数値です。
つまりInfとなります。Infを沢山加算しても値が不定なためNaNとなるわけです。
---

M-ファイルでの挑戦をしてみてください。
因みに、1.(4)はM-ファイルでの入力は、以下のようになります。Command Windowで1行ずつ入力するのと代わりませんよ。ただし、下記のプログラムはN=100とすればオーバーフローが発生することには変わりありません。
---------------------------------------------
format long
N=100;
a=0;
for n=1:N
x=n
    a=a+(4*((4*1/((2*n-1)*5^(2*n-1))*(-1)^(n+1))-(1/(2*n-1)*239^(2*n-1)*(-1)^(n+1))));
end
a
--------------------------------

投稿日時 - 2005-07-15 19:42:17

ANo.3

>prod(1:n)という表現でよいのでしょうか?
1回だけの計算ならこの表現で良いですが、級数計算になると計算効率が悪くなります。前の項までの1/n!の計算をしたら、再び1/(n+1)!の計算をするより、前の項に1/(n+1)をかけた方が、(n+1)!の計算をするよりずっと短い時間で計算が出来るからです。
エラー箇所を修正すると以下の通りです。
先頭にformat longをつけると表示桁数が倍精度桁数になります。また、倍精度計算しても、N=1000で計算した結果は、N=17項まで計算したのと同じ結果になります。つまり、余分な不要計算をすることになります。

format long
N=17
a=0; for n=1:N a=a+1/(prod(1:n); end, a

>100^(1/9)はf(x)=x^9-100としてf(x)=0のときの値をNewton法でやってほしいといわれました。Newton法はMATLABでやる場合どうやればいいのですか?

以下の形式でNewton法のプログラム(M-ファイル)を作成してください。

format long
clear
初期値の設定;
while 条件式
収束するまでの計算式:
end
収束後の処理;
結果の表示

このプログラムは、Matlabのメニューのファイル→新規作成→M-ファイル
で開くエディター(Editor)画面でプログラミングしてください。作成したファイルは「ex05.m」(拡張子は*.m)などで保存してください。
実行は、メニューのデバッグ(Debug)→実行(Execution)で実行できます。
表示はコマンドウインドウ(Command Window)になります。

投稿日時 - 2005-07-14 13:46:28

補足

1.(4)を
format long
a=0; for n=1:N a=a+(4*((4*1/((2*n-1)*5^(2*n-1))*(-1)^(n+1))-(1/(2*n-1)*239^(2*n-1)*(-1)^(n+1)))); end, a
と入力したら、n=10や20ではπの値に近づかないの100にしたらNaNとでました。これはどんな意味ですか?
Newton法で、条件式、収束後の処理とは具体的にどのような入力をすればいいのでしょう?収束の計算式は
f(x)=x^9-100とすれば
a=a+x^9-100/9*x^8と入力すればいいのですか?
あと、極限に関して、もっと具体的な方法をおしえてください。

投稿日時 - 2005-07-14 17:42:01

ANo.2

>ほんとにわからないので、1から教えてください。
どこの学校(大学)の先生が出題されたか分かりませんが、どの学生にも分かるように教えるのが、学校(大学)の先生の義務ですよ。ろくな教え方しないで課題だけ出して威張っている方は先生の資格失格です。高い授業料払って教えてもらう価値はないと思います。

>ヘルプを参照しても英語なのでさっぱりわかんないです。

数式やグラフは万国共通ですから、みれば分かるはずです。

>e^(-x)・Arctan(x)をこのまま入力してもエラーになるだけでどうして良いのかわかりません。

f(x)のところを「exp(-x)*atan(x)」とすれば良いですね。
他のプログラム言語を何かやっていればわかると思いますが。どのプログラム言語でもほぼ同じです。

>極限やΣを行う場合
計算機には精度(有効桁数)というものがあります。
要するに何桁まで正しく求めるかということです。MATLABも有限桁数の範囲でしか計算できません。
1つの式で書くのでなくプログラム(M-ファイル)で表現します。
ヒント:例えば以下のような考え方でプログラムを作成します。
Σの計算:
一般項をnを使った式で表しそれをnを1~nまで加えていく。n項目が精度以下になったら条件判断で計算を打ち切り結果を表示させる。
というプログラムをMATLABのプログラム言語(M-ファイル)で記述してください。
極限の計算:
nのときの項の値の計算とnを1増加させたときの項の値を計算し、その差が有効桁数以下になったとき計算を打ち切り結果を表示させる。
というプログラムをMATLABのプログラム言語(M-ファイル)で記述してください。

投稿日時 - 2005-07-14 00:59:54

補足

グラフを表示させることはできました。ありがとうございます。n!はprod(1:n)という表現でよいのでしょうか?これで1.(2)を
N=1000
a=0; for n=1:N a=a+1/(prod(1:N); end a
とやってみたらエラーになりました。間違っているところを指摘してもらえますか?
また、100^(1/9)はf(x)=x^9-100としてf(x)=0のときの値をNewton法でやってほしいといわれました。Newton法はMATLABでやる場合どうやればいいのですか?

投稿日時 - 2005-07-14 10:28:09

ANo.1

問題をそっくり全部、丸投げはマナー違反です。
この質問は多分削除されますよ。

問題を一部に絞り、自分である程度考えて、正しくなくても解答を作成して質問してください。

MATLABのメニューの「ヘルプ」→「MATLABヘルプ」を開いてよく読んでください。
MATLABの使い方やサンプル例題が沢山載っていますので参考にしてください。分からないところだけ質問すること。

一部のみヒント
1.(5)式どおり入力
2.(1)グラフを描く式の形式:fplot(@(x)f(x),[-5 5]);

投稿日時 - 2005-07-12 21:00:52

補足

ヘルプを参照しても英語なのでさっぱりわかんないです。また、e^(-x)・Arctan(x)をこのまま入力してもエラーになるだけでどうして良いのかわかりません。また、極限やΣを行う場合どう入力するかもわかりません。ほんとにわからないので、1から教えてください。

投稿日時 - 2005-07-12 21:28:32

あなたにおすすめの質問

[PR] お役立ち情報

PR

PR

おすすめ特集

あなたの疑問にお答えします!
あなたの疑問にお答えします!

産経新聞社会部が、あなたの身の回りで起きている問題や疑問を徹底調査した上でご報告します。