|
代码及简要说明:- Sub RsltClear() '清空E列、F列记录
- Range("E5").Resize(Range("E65536").End(3).Row) = ""
- Range("F5").Resize(Range("F65536").End(3).Row) = ""
- End Sub
- Sub kagawa() '香川直线拟合计算程序
- tms = Timer
-
- n1 = Range("N1"): If n1 = 0 Then n1 = 5: Range("N1") = n1
- ' n1 = n1 + 1: Range("N1") = n1 '自动迭代测试
- n2 = Range("O1"): If n2 = 0 Then n2 = 20: Range("O1") = n2
- ' n2 = n1 + 10: Range("O1") = n2 '自动迭代测试
- If n2 < n1 Then n2 = n1: Range("O1") = n2
-
- r = 5
- r2 = Range("Q1"): If r2 = 0 Then r2 = 1: Range("Q1") = r2
- ' r2 = r2 - 0.1: Range("Q1") = r2 '自动迭代测试
-
- m = Range("A1").End(4).Row
- ar = Range("A1").Resize(m, 2)
-
- ReDim kr(3 To m)
- For i = 3 To m - n2
- t = 0
- For j = i + n1 To i + n2
- t = t + (ar(i, 2) - ar(j, 2)) / (ar(i, 1) - ar(j, 1))
- Next
- t = Round(t / (n2 - n1 + 1), r): kr(i) = t
- If Abs(t - t1) <= r2 * 10 ^ (1 - r) Then
- k = k + 1
- Else
- If k > k1 Then k1 = k: s1 = s: s2 = i - 1: t2 = t1
- k = 1: t1 = t: s = i
- End If
- Next
- ' Debug.Print s1 & " - " & s2 & ", k = " & t2
- '到此为止先按参数设置进行每个点的斜率计算,并求得精度范围内最大起始区间及对应斜率t2
- '下面以该斜率为基准值重新进行有效精度范围内的检查
- t3 = t2
- For i = 3 To m - n2
- t = kr(i)
- If Abs(t - t3) <= r2 * 10 ^ (1 - r) Then
- k = k + 1
- Else
- If k > k1 Then k1 = k: s1 = s: s2 = i - 1: t2 = t1
- k = 1: t1 = t: s = i
- End If
- Next
- ' Debug.Print s1 & " - " & s2 & ", k = " & t2
- '这样就得到了最终的精确起始区间,以及最终的有效拟合斜率k
- '下面根据此确定斜率k 计算拟合偏移量b的平均值
- t1 = t2: t2 = 0
- For i = s1 To s2
- t = kr(i)
- If t < t1 Then t1 = t
- If t > t3 Then t3 = t
- t2 = t2 + t
- kr(i) = Round(t, r - 1)
- Next
- t2 = Round(t2 / (s2 - s1 + 1), r + 1): Range("D2") = t2
- ' Debug.Print s1 & " - " & s2 & ", k = " & t2 & "/" & t1 & "/" & t3
- Range("D3").Resize(m - 2) = WorksheetFunction.Transpose(kr)
- '下面对截取区间内的斜率值作图进行数据更新 (为直观此时的斜率值精度被降低一级Round(t, r - 1))
- If ThisWorkbook.Application.International(xlCountryCode) = 81 Then ActiveSheet.ChartObjects("僌儔僼 3").Activate
- If ThisWorkbook.Application.International(xlCountryCode) = 86 Then ActiveSheet.ChartObjects("图表 3").Activate
- ActiveChart.SeriesCollection(1).Formula = "=SERIES(Sheet2!R1C4,,Sheet2!R" & s1 - 40 & "C4:R" & s2 + 40 & "C4,1)"
- ActiveChart.Axes(xlValue).MinimumScale = Round(t1, r - 1) - 3 * 10 ^ (1 - r)
- ActiveChart.Axes(xlValue).MaximumScale = Round(t3, r - 1) + 2 * 10 ^ (1 - r)
- ActiveWindow.Visible = False
- Range("H1").Activate
-
- '下面根据得到的拟合斜率和拟合偏移量b计算截取区间内各个点的拟合值
- t3 = 0
- For i = s1 To s2
- t3 = t3 + ar(i, 2) - t2 * ar(i, 1)
- Next
- t3 = Round(t3 / (s2 - s1 + 1), r + 1): [c2] = t3
- t = "y = " & Format(t2, "0." & String(r + 1, "0")) & " * x + " & Format(t3, "0." & String(r + 1, "0"))
- Range("J1") = t: Range("F65536").End(3).Offset(1) = t
- ' Debug.Print t
-
- ReDim cr(3 To m)
- For i = s1 To s2
- cr(i) = t2 * ar(i, 1) + t3
- Next
- Range("C3").Resize(m - 2) = WorksheetFunction.Transpose(cr)
- '最后输出计算结果到E列(截取范围、密度占比、以及各项设置参数)、F列(直线表达式)
- Range("E65536").End(3).Offset(1) = s1 & " - " & s2 & " = " & s2 - s1 + 1 & Format((ar(s2, 1) - ar(s1, 1)) / ar(m, 1), " (0.0%) ") & n1 & "/" & n2 & "/" & r2
- MsgBox Format(Timer - tms, "0.000s") & vbCr & s1 & " - " & s2 & " = " & s2 - s1 + 1 & Format((ar(s2, 1) - ar(s1, 1)) / ar(m, 1), " (0.0%) ") & n1 & "/" & n2 & "/" & r2 & vbCr & t
- End Sub
复制代码 这样就很容易进行各种计算验证了。
|
评分
-
查看全部评分
|