|
▼おやじ さん:
こんばんは。遅くなりました。
>おはようございます。すいません。初心者のもので、「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」が得られます。
何かのヒントぐらいにはなりますか?
|
|