Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10856 / 13644 ツリー ←次へ | 前へ→

【19513】教えてください おやじ 04/11/5(金) 22:44 質問[未読]
【19519】Re:教えてください ichinose 04/11/6(土) 10:14 発言[未読]
【19521】Re:教えてください おやじ 04/11/6(土) 11:59 質問[未読]
【19526】Re:教えてください ichinose 04/11/6(土) 20:50 発言[未読]
【19527】Re:教えてください おやじ 04/11/6(土) 21:11 質問[未読]
【19528】Re:教えてください ichinose 04/11/6(土) 21:33 発言[未読]
【19529】Re:教えてください おやじ 04/11/6(土) 23:20 質問[未読]
【19538】Re:教えてください ichinose 04/11/7(日) 17:16 発言[未読]
【19541】Re:教えてください おやじ 04/11/7(日) 17:59 回答[未読]

【19513】教えてください
質問  おやじ  - 04/11/5(金) 22:44 -

引用なし
パスワード
   「xの関数f(x) = x^5 - ax^4 + bx^3 - cx^2 + dx - e がf(x) = 0となる実数解を0〜100の間にいくつ持つのか求めるプログラムを作れ。ただし、係数a,b,c,d,eには任意の2桁から3桁の整数を入れよ。上記のプログラムにニュートンの逐次近似法で、方程式の解を求めるプログラムを加えよ。全ての解が表示されるように良く考えること。」なる課題が出されたのですが良く分かりません。教えてください。

【19519】Re:教えてください
発言  ichinose  - 04/11/6(土) 10:14 -

引用なし
パスワード
   ▼おやじ さん:
おはようございます。


>「xの関数f(x) = x^5 - ax^4 + bx^3 - cx^2 + dx - e がf(x) = 0となる実数解を0〜100の間にいくつ持つのか求めるプログラムを作れ。ただし、係数a,b,c,d,eには任意の2桁から3桁の整数を入れよ。上記のプログラムにニュートンの逐次近似法で、方程式の解を求めるプログラムを加えよ。全ての解が表示されるように良く考えること。」なる課題が出されたのですが良く分かりません。教えてください。
「ニュートンの逐次近似法」と記述がなければ・・・、
「x^5 - ax^4 + bx^3 - cx^2 + dx - e」のxの範囲が0〜100と限定してくれているのですから、

0〜100までを(例えば0.001刻みで)ループさせて上記式の答えが0に近い数(これも基準を決めて)の個数を数えればよいですよね?

でも、これだと0〜1までに1000回ループさせることになりますよね?

このループ回数を少なくするために「ニュートンの逐次近似法」なる手法を使いなさい
と言う事だと思いますが・・・。


「ニュートン法」で検索してみて下さい(Google等で)。

中身までは、見てませんが、引っかかっていたので
まず、「ニュートン法」のアルゴリズムを調べるところから始めてみては?
いかがでしょうか?

【19521】Re:教えてください
質問  おやじ  - 04/11/6(土) 11:59 -

引用なし
パスワード
   おはようございます。すいません。初心者のもので、「0〜100までを(例えば0.001刻みで)ループさせて上記式の答えが0に近い数(これも基準を決めて)の個数を数えればよい」をどのようにプログラムしたらいいのか分かりません。何かヒント的なものでもいいので教えていただけないでしょうか?

【19526】Re:教えてください
発言  ichinose  - 04/11/6(土) 20:50 -

引用なし
パスワード
   ▼おやじ さん:
こんばんは。遅くなりました。

>おはようございます。すいません。初心者のもので、「0〜100までを(例えば0.001刻みで)ループさせて上記式の答えが0に近い数(これも基準を決めて)の個数を数えればよい」をどのようにプログラムしたらいいのか分かりません。何かヒント的なものでもいいので教えていただけないでしょうか?

もし、ニュートン法を使用しないで解の個数を求めるとなると・・・、
'===============================================================
Sub main()
Dim a(4) As Double
Dim ans
Dim cnt As Long
a(0) = 10
a(1) = 25
a(2) = 35
a(3) = 45
a(4) = 100
'この時は、x^5 - 10x^4 + 25x^3 - 35x^2 + 45x - 100となります
ans = Func_Slt_cnt(a(), CDec(0.001))
MsgBox ans
End Sub
'=========================================================
Function Func_Slt_cnt(Coefficient() As Double, _
          Interval As Variant _
          ) As Long
'機    能: 関数f(x) = x^5 - ax^4 + bx^3 - cx^2 + dx - eにおいて、
'        xが0〜100のとき、f(x)=0の解の個数を求める
'入力データ : Coefficient() ---- 係数a、b、c、d、eに相当する値が入った配列
'        Ineterval   ----- 調査間隔値
'出力データ : Func_Slt_cnt   ----- 解の数
  Dim x As Variant
  Dim wk As Double
  Dim ans() As Double
  Dim a_mark As Long 'f(x)の符号 -1---負 0---0 1---正
  Dim f_mark As Long '一つ前のf(x)の符号 -1---負 0---0 1---正
  Func_Slt_cnt = 0
  For x = CDec(0) To CDec(100) Step Interval
    'wk = x ^ 2 + Coefficient(0) * x + Coefficient(1)
    wk = x ^ 5 - Coefficient(0) * x ^ 4 + Coefficient(1) * x ^ 3 - Coefficient(2) * x ^ 2 + Coefficient(3) * x - Coefficient(4)
    If x = 0 Then
     If wk = 0 Then
       f_mark = 0
     ElseIf wk > 0 Then
       f_mark = 1
     Else
       f_mark = -1
       End If
     End If
    If wk = 0 Then
     a_mark = 0
    ElseIf wk > 0 Then
     a_mark = 1
    Else
     a_mark = -1
     End If
    If a_mark = 0 Or (a_mark <> f_mark And f_mark <> 0) Then
     Func_Slt_cnt = Func_Slt_cnt + 1
     End If
    f_mark = a_mark
    Next x
End Function

なんてコードで上の場合は、「1」が求められます。

試しに「Func_Slt_cnt」の

wk = x ^ 5 - Coefficient(0) * x ^ 4 + Coefficient(1) * x ^ 3 - Coefficient(2) * x ^ 2 + Coefficient(3) * x - Coefficient(4)

の箇所を簡単な2次関数に変えて、

wk = x ^ 2 + Coefficient(0) * x + Coefficient(1)

こんな式にして、

mainも

'===========================================================
Sub main()
Dim a(1) As Double
Dim ans
Dim cnt As Long
a(0) = -61
a(1) = 550
'この時は、x^2 - 61x^4 + 550 となります
ans = Func_Slt_cnt(a(), CDec(0.001))
MsgBox ans
End Sub

で実行すると、「2」が得られます。

何かのヒントぐらいにはなりますか?

【19527】Re:教えてください
質問  おやじ  - 04/11/6(土) 21:11 -

引用なし
パスワード
   ▼ichinose さん:
>▼おやじ さん:
>こんばんは。遅くなりました。
>
>>おはようございます。すいません。初心者のもので、「0〜100までを(例えば0.001刻みで)ループさせて上記式の答えが0に近い数(これも基準を決めて)の個数を数えればよい」をどのようにプログラムしたらいいのか分かりません。何かヒント的なものでもいいので教えていただけないでしょうか?
>
>もし、ニュートン法を使用しないで解の個数を求めるとなると・・・、
>'===============================================================
>Sub main()
>Dim a(4) As Double
>Dim ans
>Dim cnt As Long
>a(0) = 10
>a(1) = 25
>a(2) = 35
>a(3) = 45
>a(4) = 100
>'この時は、x^5 - 10x^4 + 25x^3 - 35x^2 + 45x - 100となります
>ans = Func_Slt_cnt(a(), CDec(0.001))
>MsgBox ans
>End Sub
>'=========================================================
>Function Func_Slt_cnt(Coefficient() As Double, _
>          Interval As Variant _
>          ) As Long
>'機    能: 関数f(x) = x^5 - ax^4 + bx^3 - cx^2 + dx - eにおいて、
>'        xが0〜100のとき、f(x)=0の解の個数を求める
>'入力データ : Coefficient() ---- 係数a、b、c、d、eに相当する値が入った配列
>'        Ineterval   ----- 調査間隔値
>'出力データ : Func_Slt_cnt   ----- 解の数
>  Dim x As Variant
>  Dim wk As Double
>  Dim ans() As Double
>  Dim a_mark As Long 'f(x)の符号 -1---負 0---0 1---正
>  Dim f_mark As Long '一つ前のf(x)の符号 -1---負 0---0 1---正
>  Func_Slt_cnt = 0
>  For x = CDec(0) To CDec(100) Step Interval
>    'wk = x ^ 2 + Coefficient(0) * x + Coefficient(1)
>    wk = x ^ 5 - Coefficient(0) * x ^ 4 + Coefficient(1) * x ^ 3 - Coefficient(2) * x ^ 2 + Coefficient(3) * x - Coefficient(4)
>    If x = 0 Then
>     If wk = 0 Then
>       f_mark = 0
>     ElseIf wk > 0 Then
>       f_mark = 1
>     Else
>       f_mark = -1
>       End If
>     End If
>    If wk = 0 Then
>     a_mark = 0
>    ElseIf wk > 0 Then
>     a_mark = 1
>    Else
>     a_mark = -1
>     End If
>    If a_mark = 0 Or (a_mark <> f_mark And f_mark <> 0) Then
>     Func_Slt_cnt = Func_Slt_cnt + 1
>     End If
>    f_mark = a_mark
>    Next x
>End Function
>
>なんてコードで上の場合は、「1」が求められます。
>
>試しに「Func_Slt_cnt」の
>
>wk = x ^ 5 - Coefficient(0) * x ^ 4 + Coefficient(1) * x ^ 3 - Coefficient(2) * x ^ 2 + Coefficient(3) * x - Coefficient(4)
>
>の箇所を簡単な2次関数に変えて、
>
>wk = x ^ 2 + Coefficient(0) * x + Coefficient(1)
>
>こんな式にして、
>
>mainも
>
>'===========================================================
>Sub main()
>Dim a(1) As Double
>Dim ans
>Dim cnt As Long
>a(0) = -61
>a(1) = 550
>'この時は、x^2 - 61x^4 + 550 となります
>ans = Func_Slt_cnt(a(), CDec(0.001))
>MsgBox ans
>End Sub
>
>で実行すると、「2」が得られます。
>
>何かのヒントぐらいにはなりますか?


こんばんはm(__)m
ありがとうございます。何度も申し訳ないんですが一番初めのプログラムを入力して実行すると、「Func_Slt_cnt」のところが反転して、SubまたはFunctionが定義されていませんと表示されてしまうのですが・・・どうしたらよいのでしょう?

【19528】Re:教えてください
発言  ichinose  - 04/11/6(土) 21:33 -

引用なし
パスワード
   ▼おやじ さん:
>こんばんはm(__)m
>ありがとうございます。何度も申し訳ないんですが一番初めのプログラムを入力して実行すると、「Func_Slt_cnt」のところが反転して、SubまたはFunctionが定義されていませんと表示されてしまうのですが・・・どうしたらよいのでしょう?

ん?、どのようにコピーされたのでしょうか?
Function Func_Slt_cnt(Coefficient() As Double, _
以下のコードもコピーしないと駄目ですよ!!(End Functionまで)
「SubまたはFunctionが定義されていません」というエラーメッセージは、
Function Func_Slt_cnt・・・
が認識できないと発生します。

【19529】Re:教えてください
質問  おやじ  - 04/11/6(土) 23:20 -

引用なし
パスワード
   ▼ichinose さん:
>▼おやじ さん:
>>こんばんはm(__)m
>>ありがとうございます。何度も申し訳ないんですが一番初めのプログラムを入力して実行すると、「Func_Slt_cnt」のところが反転して、SubまたはFunctionが定義されていませんと表示されてしまうのですが・・・どうしたらよいのでしょう?
>
>ん?、どのようにコピーされたのでしょうか?
>Function Func_Slt_cnt(Coefficient() As Double, _
>以下のコードもコピーしないと駄目ですよ!!(End Functionまで)
>「SubまたはFunctionが定義されていません」というエラーメッセージは、
>Function Func_Slt_cnt・・・
>が認識できないと発生します。

おかげさまで実行できました。ありがとうございました。解の値と解の数の両方を表示するにはどうしたらよいのですか?

【19538】Re:教えてください
発言  ichinose  - 04/11/7(日) 17:16 -

引用なし
パスワード
   ▼おやじ さん:
こんばんは。

>
>おかげさまで実行できました。ありがとうございました。解の値と解の数の両方を表示するにはどうしたらよいのですか?
私が投稿したアルゴリズムに追加してもやろうと思えば出来ますが・・・。
最初に投稿した
>0〜100までを(例えば0.001刻みで)ループさせて上記式の答えが0に近い数(これも基準を決めて)の個数を数えればよいですよね?
こんな方法を使うと結果は出てきそうです。
実は、前回のコードを投稿する前にそれも作ってみましたが、定数の設定によっては
0〜100の間の刻みを0.000001の間隔で調査していかないと近い数字が求められませんでした。
これだと1千万回ループになっしまいます。又、これで出来たとしても
「ニュートンの逐次近似法」という手法は使っていない事になります。
それでは、おやじ さんの意図する結果ではありませんよね?

私も「ニュートンの逐次近似法」という言葉は聞いた事がある程度です。
聞いた事があるので、おそらく20数年以上前に見たこともあるのでしょうが、
その程度です。

この「ニュートン法」なる解法を調べて私にそして、このサイトを見ている方に
ご自分の言葉で説明してくれませんか?

前に申し上げましたが、ネットで「ニュートン法」で検索すれば、
何件か引っかかっています。

前にも申し上げましたが、何の根拠も無く、ただ0〜100の間を小さい刻みで調査していくより、この「ニュートン法」なる手法を用いれば、調査回数を減らすことが可能なのだと思います(うる覚えですが、接線を使用するんだと思いましたが)。

私が調べれば、私の勉強にはなりますけど・・・。

【19541】Re:教えてください
回答  おやじ  - 04/11/7(日) 17:59 -

引用なし
パスワード
   ▼ichinose さん:
>▼おやじ さん:
>こんばんは。
>
>>
>>おかげさまで実行できました。ありがとうございました。解の値と解の数の両方を表示するにはどうしたらよいのですか?
>私が投稿したアルゴリズムに追加してもやろうと思えば出来ますが・・・。
>最初に投稿した
>>0〜100までを(例えば0.001刻みで)ループさせて上記式の答えが0に近い数(これも基準を決めて)の個数を数えればよいですよね?
>こんな方法を使うと結果は出てきそうです。
>実は、前回のコードを投稿する前にそれも作ってみましたが、定数の設定によっては
>0〜100の間の刻みを0.000001の間隔で調査していかないと近い数字が求められませんでした。
>これだと1千万回ループになっしまいます。又、これで出来たとしても
>「ニュートンの逐次近似法」という手法は使っていない事になります。
>それでは、おやじ さんの意図する結果ではありませんよね?
>
>私も「ニュートンの逐次近似法」という言葉は聞いた事がある程度です。
>聞いた事があるので、おそらく20数年以上前に見たこともあるのでしょうが、
>その程度です。
>
>この「ニュートン法」なる解法を調べて私にそして、このサイトを見ている方に
>ご自分の言葉で説明してくれませんか?
>
>前に申し上げましたが、ネットで「ニュートン法」で検索すれば、
>何件か引っかかっています。
>
>前にも申し上げましたが、何の根拠も無く、ただ0〜100の間を小さい刻みで調査していくより、この「ニュートン法」なる手法を用いれば、調査回数を減らすことが可能なのだと思います(うる覚えですが、接線を使用するんだと思いましたが)。
>
>私が調べれば、私の勉強にはなりますけど・・・。


こんばんわ
わかりました。ありがとうございます(^.^) 何とかしてみます。

10856 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free