[[20150902210840]] 『任意の配列を補完して、関数の様に扱うには?』(Ktng) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『任意の配列を補完して、関数の様に扱うには?』(Ktng)

長文となり、恐縮です。
現在、私は下記の内容を思案中ですが、妙案が思いつきません。
下記内容が、出来れば、理系で助かる人も多いのではと思い投稿させて頂きます。
よろしくお願いします。

未知の関数Y=f(X)で示される
下の様なデータ(m,n)を測定したとします。
下記の様に、(m,n)は、それぞれ、セル(A3,B3)から、セル(An,Bn)まで、入力されています。
ただ、mの間隔は一定間隔と言うわけでも有りません。
ここで、データ(m,n)系列を用いて、任意のxの時のyの値をY=f(X)の様に求めたいです。

求めたいxは
m, x, M, M' の様に並んで居るとして、
求めるに当たっては、(m,f(m)), (M, f(M)), (M' ,f(M'))の3つを用います。
補完の方法は、この3つの(x,y)より二次関数のabcを求めます。その二次関数を求めて、yを計算したいです。

例えば、下表において x=105の時に前後の値を用いてf(105)=?
を補完して求める様な式はどの様になりますでしょうか?
補完に使用する値は、
(100,m)
(110,M)
(122,M')
の3点を用いて、
100-105(所謂x)-110-122
の様に、なっていて、 m、 M、
M'より二次関数のabcを求めます。
y=ax^2+bx+c に105を当てはめてyを求める様にしたいです。

何卒、よろしくお願いします。

AB
x y
1 a
2 b
4 c
9 d
:
100 m
110 M
122 M'
:
n N

< 使用 Excel:Excel2013、使用 OS:Windows7 >


Linest関数を使う例
http://kenkitagawa.cocolog-nifty.com/blog/2015/07/excel-d08f.html

(マナ) 2015/09/02(水) 22:07


別法です。
 苦手分野ですが、教科書ひっぱりだしできて、
 ちょっとのつもりが、午前中からかかりきりで、疲れました…。

 ユーザー定義関数です:Ktng(rngXY, x)

 ・一つ目の引数rngXYは、既知の(x,y)の組み合わせ
 ・2次回帰式なので、最低3組のデータが必要
 ・1列目がx,2列目がy
 ・2つ目の引数が、計算したいx
 ・3次、4次の式に対応可能なように修正するには、引数ふやす

	A	B		C	D
 1	既知x	既知y		x	f(x)
 2	100	2		105	=ktng($A$2:$B$5,C2)
 3	110	3			
 4	120	5			
 5	130	7

 Function Ktng(rngXY As Range, x)
    Dim Data
    Dim S() As Double
    Dim T(1 To 3, 1 To 3) As Double
    Dim U(1 To 3, 1 To 3) As Double
    Dim p(1 To 3) As Double
    Dim n As Long, m As Long
    Dim i As Long, j As Long, k As Long

    If rngXY.Columns.Count <> 2 Then Ktng = "err": Exit Function
    n = rngXY.Rows.Count
    If n < 3 Then Ktng = "err": Exit Function

    ReDim S(1 To n + 1, 1 To 7)
    m = n
    Data = rngXY.Value

    For i = 1 To n
        If IsNumeric(Data(i, 1)) = True And IsEmpty(Data(i, 1)) = False _
                And IsNumeric(Data(i, 2)) = True And IsEmpty(Data(i, 2)) = False Then
            S(i, 1) = Data(i, 1)    'X
            S(i, 5) = Data(i, 2)    'Y
        Else
            m = m - 1           '有効なデータ数
        End If
    Next

    If m < 3 Then Ktng = "err": Exit Function

    For i = 1 To n
        For j = 2 To 4     'X^2, X^3. X^4
            S(i, j) = S(i, 1) ^ j
        Next
        For j = 6 To 7     'YX, YX^2
            S(i, j) = S(i, 5) * S(i, j - 5)
        Next
    Next
    For j = 1 To 7
        For i = 1 To n
            S(n + 1, j) = S(n + 1, j) + S(i, j)
        Next
    Next

    For i = 1 To 3
        For j = 1 To 3
            k = i + j - 2
            If k = 0 Then
                T(i, j) = m
            Else
                T(i, j) = S(n + 1, k)
            End If
        Next
        U(i, 1) = S(n + 1, i + 4)
    Next

    With WorksheetFunction
        For i = 1 To 3
            p(i) = .Index(.MMult(.MInverse(T), U), i, 1)
        Next
    End With

    For i = 1 To 3
        Ktng = Ktng + p(i) * x ^ (i - 1)
    Next

 End Function

(マナ) 2015/09/06(日) 19:56


暇つぶしで、Linest関数バージョンも作ってみました。
 Function Ktng2(rngXY As Range, x As Double, Optional d As Long = 2)
    Dim Data
    Dim Sx() As Double
    Dim Sy() As Double
    Dim p() As Double
    Dim n As Long, m As Long
    Dim i As Long, j As Long

    If rngXY.Columns.Count <> 2 Then Ktng2 = "err": Exit Function
    n = rngXY.Rows.Count
    If n < d + 1 Then Ktng2 = "err": Exit Function

    ReDim Sx(1 To d, 1 To n)
    ReDim Sy(1 To 1, 1 To n)

    Data = rngXY.Value
    For i = 1 To n
        If IsNumeric(Data(i, 1)) = True And IsEmpty(Data(i, 1)) = False _
                And IsNumeric(Data(i, 2)) = True And IsEmpty(Data(i, 2)) = False Then
            m = m + 1           '有効なデータ数
            For j = 1 To d
                Sx(j, m) = Data(i, 1) ^ j  'X. X^2,…, X^d
            Next
            Sy(1, m) = Data(i, 2)    'Y
        End If
    Next

    If m < d + 1 Then Ktng2 = "err": Exit Function

    ReDim Preserve Sx(1 To d, 1 To m)
    ReDim Preserve Sy(1 To 1, 1 To m)
    ReDim p(0 To d)

    With WorksheetFunction
        For i = 0 To d
            p(i) = .Index(.LinEst(.Transpose(Sy), .Transpose(Sx)), i + 1)
        Next
    End With

    For i = 0 To d
        Ktng2 = Ktng2 + p(i) * x ^ (d - i)
    Next

 End Function

(マナ) 2015/09/12(土) 16:46


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.