tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Spline Chart で補完部分の値を得たい
投稿日: 2019/07/19(Fri) 12:12
投稿者食器
Visual Basic の SplineChart について

知りたいことは次の2点いずれかです。
@SplineChartの任意のxに対するyの値の取得
AVBのSplineと同じ曲線を描くための数学関数を求める方法

今年の4月からプログラミングを勉強中で
現在はVisual Studio 2017 で、VBでのコードを書いてます。
こちらのサイトを大いに参考にさせて頂いております。


お尋ねしたいのですが、
ChartTypeをSplineに設定して3点を追加すると、
グラフ上にその3点を通る曲線が描かれると思います。

このとき指定したxの値に対する
曲線上のyの値を取得することは可能でしょうか?

取得方法があれば教えて頂きたいです。




自分では方法がわからなかったので、
今はスプライン補間を計算により行うことで数値を取得しています。

http://morimori2008.web.fc2.com/contents/PCprograming/VB/VB.html
こちらのプログラムを参考にして行列計算を行い、
三次関数の係数を求め、方程式を得ることでPointChartとして描いています。

例えば3点が(1,1),(4,7),(5,3)の場合は以下のようになります。

Dim a As New personal_muth.matrix2D(8, 8)
Dim a_inverse(7, 7) As Double

a.matrix(0, 0) = 1 : a.matrix(0, 1) = 1 : a.matrix(0, 2) = 1 : a.matrix(0, 3) = 1 : a.matrix(0, 4) = 0 : a.matrix(0, 5) = 0 : a.matrix(0, 6) = 0 : a.matrix(0, 7) = 0
a.matrix(1, 0) = 64 : a.matrix(1, 1) = 16 : a.matrix(1, 2) = 4 : a.matrix(1, 3) = 1 : a.matrix(1, 4) = 0 : a.matrix(1, 5) = 0 : a.matrix(1, 6) = 0 : a.matrix(1, 7) = 0
a.matrix(2, 0) = 0 : a.matrix(2, 1) = 0 : a.matrix(2, 2) = 0 : a.matrix(2, 3) = 0 : a.matrix(2, 4) = 64 : a.matrix(2, 5) = 16 : a.matrix(2, 6) = 4 : a.matrix(2, 7) = 1
a.matrix(3, 0) = 0 : a.matrix(3, 1) = 0 : a.matrix(3, 2) = 0 : a.matrix(3, 3) = 0 : a.matrix(3, 4) = 125 : a.matrix(3, 5) = 25 : a.matrix(3, 6) = 5 : a.matrix(3, 7) = 1
a.matrix(4, 0) = 48 : a.matrix(4, 1) = 8 : a.matrix(4, 2) = 1 : a.matrix(4, 3) = 0 : a.matrix(4, 4) = -48 : a.matrix(4, 5) = -8 : a.matrix(4, 6) = -1 : a.matrix(4, 7) = 0
a.matrix(5, 0) = 24 : a.matrix(5, 1) = 2 : a.matrix(5, 2) = 0 : a.matrix(5, 3) = 0 : a.matrix(5, 4) = -24 : a.matrix(5, 5) = -2 : a.matrix(5, 6) = 0 : a.matrix(5, 7) = 0
a.matrix(6, 0) = 6 : a.matrix(6, 1) = 2 : a.matrix(6, 2) = 0 : a.matrix(6, 3) = 0 : a.matrix(6, 4) = 0 : a.matrix(6, 5) = 0 : a.matrix(6, 6) = 0 : a.matrix(6, 7) = 0
a.matrix(7, 0) = 0 : a.matrix(7, 1) = 0 : a.matrix(7, 2) = 0 : a.matrix(7, 3) = 0 : a.matrix(7, 4) = 30 : a.matrix(7, 5) = 2 : a.matrix(7, 6) = 0 : a.matrix(7, 7) = 0

a_inverse = a.inverse()

Dim b(7) As Double
b(0) = 1 : b(1) = 7 : b(2) = 7 : b(3) = 3 : b(4) = 0 : b(5) = 0 : b(6) = 0 : b(7) = 0
Dim ans(7) As Double
Dim i, j As Integer

For i = 0 To 7
 For j = 0 To 7
  ans(i) = ans(i) + a_inverse(i, j) * b(j)
 Next
Next

Chart1.Series.Add("DotSpline") 'オレンジ色の計算して描いたSpline
With Chart1.Series("DotSpline")
 .ChartType = DataVisualization.Charting.SeriesChartType.Point
 .MarkerStyle = DataVisualization.Charting.MarkerStyle.Circle
 .MarkerSize = 3
 .MarkerColor = Color.Orange
 .MarkerStep = 1
End With

Dim x, y As Double
x = 0

Do
 If 1 <= x And x <= 4 Then
  y = ans(0) * x ^ 3 + ans(1) * x ^ 2 + ans(2) * x + ans(3)
  Chart1.Series("DotSpline").Points.AddXY(x, y)
 ElseIf 4 < x And x <= 5 Then
  y = ans(4) * x ^ 3 + ans(5) * x ^ 2 + ans(6) * x + ans(7)
  Chart1.Series("DotSpline").Points.AddXY(x, y)
 End If

 x = x + 0.01

Loop Until x > 5


Chart1.Series.Add("Spline") '青色のVBSplineChart

With Chart1.Series("Spline")
 .ChartType = DataVisualization.Charting.SeriesChartType.Spline
End With

Chart1.Series("Spline").Points.AddXY(1, 1)
Chart1.Series("Spline").Points.AddXY(4, 7)
Chart1.Series("Spline").Points.AddXY(5, 3)


結果を見ると確かに3点を通るのですが、
計算して描いたオレンジと元々の青色が一致しません。

自然スプラインを描くように端点の2次導関数を0とする境界条件が誤っているのでしょうか?
それとも、そもそも3次関数ではないのでしょうか
調べたところVBのSplineにテンション設定値があるとも見受けられましたが、それが関係するのでしょうか?


@SplineChartの任意のxに対するyの値の取得
AVBのSplineと同じ曲線を描くための数学関数を求める方法

このいずれかを知りたく思います。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。