Excel VBA質問箱 IV

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

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


12786 / 13646 ツリー ←次へ | 前へ→

【8668】最小二乗法の課題で・・・。 学生です 03/10/28(火) 16:40 質問
【8672】Re:それを考えるのが勉強 角田 03/10/28(火) 17:58 発言
【8674】Re:最小二乗法の課題で・・・。 りん 03/10/28(火) 18:17 回答
【8675】Re:ヒントその3 ichinose 03/10/28(火) 23:39 発言

【8668】最小二乗法の課題で・・・。
質問  学生です  - 03/10/28(火) 16:40 -

引用なし
パスワード
   学校の課題で、セル(1、1)からセル(30、1)に30個のxの測定値が書き込まれている。また、セル(1、2)からセル(30、2)に30個のyの測定値が書き込まれている。これらのn組(n=30)のデータは直線 y=a+bx によって代表されるとして、データを最も良く代表する切片aと傾きbを線形最小二乗法によって求めると以下のように表される。

y=a+bx
  b=Sxy/Sx
  a=yave-bxave
    Sx=Σ(xi-xave)2
    Sxy=Σ(xi-xave)(yi-yave)
    xave=(1/n)Σxi
    yave=(1/n)Σyi
ただし、
Σf(xi)=f(x1)+f(x2)+ ・・+f(xn)
を表す。上記のn組のデータから決定されるaをセル(1、3)に、bをセル(2、3)に出力するVBAプログラムを書け。という問題がありまして、
Sub for3()
Dim x As Integer, y As Integer, a As Integer, b As Integer, sxy As Integer, sx As Integer, xave As Integer, yave As Integer, xi As Integer, yi As Integer, wx As Integer, wy As Integer
xi = Cells(x, 1).Value
yi = Cells(y, 2).Value
wx = 0
wy = 0
For x = 1 To 30 Step 1
wx = wx + x
Next x
For y = 1 To 30 Step 1
wy = wy + y
Next y
yi = a * xi + b
b = sxy - sx
a = yave - b * xave
sx = (wx - xave) ^ 2
sxy = (wx - xave) * (wy - yave)
xave = wx / 30
yave = wy / 30
Cells(1, 3).Value = a
Cells(2, 3).Value = b
End Sub
と書いたのですがうまくいきません。
どこが悪いのか教えてください。
長くなってすいません。よろしくお願いします。

【8672】Re:それを考えるのが勉強
発言  角田 WEB  - 03/10/28(火) 17:58 -

引用なし
パスワード
   こんにちは。
>学校の課題で、VBAプログラムを書け。という問題がありまして、
>と書いたのですがうまくいきません。
>どこが悪いのか教えてください。
何かの実習で「たまたまVBAを利用している」というのではなく、
VBAそのものの演習なんでしょ!
何が原因なのか、どこが悪いのか‥‥を調べるのが『勉強』というものです。
せっかくの勉強する『機会』を横取りするのは良くないね、やっぱ♪

>と書いたのですがうまくいきません
こういう問いでは「どう、上手くないの?」と返されて終わりですね。
「どう上手くないのか」自分で整理してまとめれば、自ずと、どこが
原因なのか見えてくるでしょう。

【8674】Re:最小二乗法の課題で・・・。
回答  りん E-MAIL  - 03/10/28(火) 18:17 -

引用なし
パスワード
   学生です さん、こんばんわ。

ワークシート関数を使ってみたり(笑)
Sub test()
  Dim r1 As Range, r2 As Range
  Set r1 = Range("A1:A30"): Set r2 = Range("B1:B30")
  With Application.WorksheetFunction
   Range("C1").Value = .Index(.LinEst(r1, r2), 2)
   Range("C2").Value = .Index(.LinEst(r1, r2), 1)
  End With
  Set r1 = Nothing: Set r2 = Nothing
End Sub

それはおいといて。

>どこが悪いのか教えてください。
とりあえずヒントだけ

      ↓xとyが0なので行番号として問題外なのでエラー
>xi = Cells(x, 1).Value
>yi = Cells(y, 2).Value

      ↓セルが参照されてないです(ただ1から30を足しているだけ)
>For x = 1 To 30 Step 1
>wx = wx + x
>Next x
>For y = 1 To 30 Step 1
>wy = wy + y
>Next y

【8675】Re:ヒントその3
発言  ichinose  - 03/10/28(火) 23:39 -

引用なし
パスワード
   ▼学生です さん:
こんばんは。
コードを拝見しました。
>y=a+bx
>  b=Sxy/Sx
>  a=yave-bxave
>    Sx=Σ(xi-xave)2
>    Sxy=Σ(xi-xave)(yi-yave)
>    xave=(1/n)Σxi
>    yave=(1/n)Σyi

この問題の上記の式を理解されていますか?
例を作成してみるとよいと思いますが。
a=1、b=2とした場合、
A列に1〜30を入力し、
B列に3,5,7,9・・・・と入力してみて下さい。
これでこの計算式に当てはめて 結果、a=1、b=2になる事を確認して下さい。
すると、やらなければならない事が見えてくると思います。

そうすると、

>Sub for3()
>Dim x As Integer, y As Integer, a As Integer, b As Integer, sxy As Integer, sx As Integer, xave As Integer, yave As Integer, xi As Integer, yi As Integer, wx As Integer, wy As Integer
'↑の変数の型が整数ではまずいかな?ということも見えてくると思います。

>xi = Cells(x, 1).Value
>yi = Cells(y, 2).Value
>wx = 0
>wy = 0
>For x = 1 To 30 Step 1
>wx = wx + x
>Next x
>For y = 1 To 30 Step 1
>wy = wy + y
>Next y
>yi = a * xi + b
>b = sxy - sx
>a = yave - b * xave
>sx = (wx - xave) ^ 2
>sxy = (wx - xave) * (wy - yave)
>xave = wx / 30
>yave = wy / 30
>Cells(1, 3).Value = a
>Cells(2, 3).Value = b
>End Sub

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