2023年4月18日火曜日

linest関数とseriessum関数の使い方(邪道か?)

旧ブログ https://blog.goo.ne.jp/yuuhae612go

 

3点を通る2次関数・2次曲線・2次の多項式

4点を通る3次関数・3次曲線・3次の多項式

5点を通る4次関数・4次曲線・4次の多項式

6点を通る5次関数・5次曲線・5次の多項式

7点を通る6次関数・6次曲線・6次の多項式

8点を通る7次関数・7次曲線・7次の多項式

9点を通る8次関数・8次曲線・8次の多項式

10点を通る9次関数・9次曲線・9次の多項式

    …

n+1点を通るn次関数・n次曲線・n次の多項式


linest関数で多項式の係数を求めてseriessum関数でその係数とxからyを求める。

任意の点10個(p1~p10)を用意してD4:D13にそのy座標を、F4:F13にそのx座標を入力して、E列の定数(x^0)からN列のx^9までを配置する。(linest関数では定数の列は不使用)

{G4:G13} =ArrayFormula($F4:$F13^G2)

H~N列に{G4:G13}をコピペ

または

{G4:N13} =ArrayFormula($F4:$F13^{2,3,4,5,6,7,8,9})

「0^0=1」は必ずしも正しい訳ではないが表計算ソフトがそれを正しいとして出力するので利用している。「x=0」を場合分けで別処理すれば正当性は高くなる。

BCDEFGHIJKLMN
20123456789
30^0=1として計算yx^0x^1x^2x^3x^4x^5x^6x^7x^8x^9
41p141000000000
52p211248163264128256512
63p3013927812437292187656119683
74p42141664256102440961638465536262144
85p541525125625312515625781253906251953125
96p6516362161296777646656279936167961610077696
107p771749343240116807117649823543576480140353607
118p881864512409632768262144209715216777216134217728
129p961981729656159049531441478296943046721387420489
1310p1001101001000100001000001000000100000001000000001000000000


{E33:N33} =ArrayFormula(linest(D4:D13,F4:N13))

{F34:N34} =ArrayFormula(linest(D4:D12,F4:M12))

{G35:N35} =ArrayFormula(linest(D4:D11,F4:L11)) 以下略

B C D E F G H I J K LM N

32 linest関数を使用 x^9の係数 x^8の係数 x^7の係数 x^6の係数 x^5の係数 x^4の係数 x^3の係数 x^2の係数 x^1の係数 x^0の係数
33 10 p1~p10を通る9次関数 0.00 0.01 -0.13 1.42 -9.38 37.63 -88.74 112.24 -59.95 4.00
34 9 p1~p9を通る8次関数 0.00 -0.02 0.28 -2.149.18 -21.27 24.27 -11.85 4.00
358p1~p8を通る7次関数0.000.02-0.10-0.173.50-10.858.604.00
367p1~p7を通る6次関数0.000.14-1.497.55-17.2212.604.00
376p1~p6を通る5次関数0.04-0.754.79-12.259.174.00
385p1~p5を通る4次関数-0.171.83-5.834.174.00
394p1~p4を通る3次関数0.33-1.500.174.00
403p1~p3を通る2次関数0.17-1.834.00
412p1~p2を通る1次関数-1.504.00


46~55行は10個の点の座標、56行以下はn次曲線の散布図用データ

E56 =if($D56=0,$N$33,seriessum($D56,E$44-1,-1,E$33:$N$33))

F56 =if($D56=0,$N$34,seriessum($D56,F$44-1,-1,F$34:$N$34))

 (中略)

M56 =if($D56=0,$N$41,seriessum($D56,M$44-1,-1,M$41:$N$41))

E56:M56をE56:E266にコピペ。


BCDEFGHIJKLMN

43
seriessum関数使用(linest関数の結果から)
44グラフ用1098765432
45-1←10点のxの最小値xy(10点)y(9点)y(8点)y(7点)y(6点)y(5点)y(4点)y(3点)y(2点)y(p1-p10)
4610←10点のxの最大値-14
471.1←xの範囲の1割21
4820←分割30
4942
5054
5165
5277
5388
5496
55100
56-1.28119.86134.2830.907-6.154-3.5330.4123.1204.2754.275
57-1.2290.00126.4701.559-3.743-1.7621.2433.3234.2204.220
58-1.1763.79519.6142.197-1.532-0.1292.0153.5124.1654.165
59-1.1140.92213.6352.8190.4891.3712.7303.6884.1104.110
60-1.0621.0838.4543.4212.3302.7463.3913.8514.0554.055
61-1.004.0004.0004.0004.0004.0004.0004.0004.0004.000
62-0.95-10.5870.2064.5545.5085.1394.5584.1373.9453.945
63-0.89-22.917-2.9925.0816.8646.1705.0674.2613.8903.890
64-0.84-33.216-5.6515.5808.0747.0965.5304.3733.8353.835
65-0.78-41.688-7.8276.0479.1487.9245.9474.4743.7803.780
66-0.73-48.527-9.5706.48310.0948.6586.3214.5623.7253.725
67-0.67-53.910-10.9266.88710.9199.3046.6544.6403.6703.670
68-0.62-57.998-11.9397.25711.6299.8656.9464.7073.6153.615
69-0.56-60.944-12.6507.59312.23410.3487.2014.7633.5603.560
70-0.51-62.884-13.0967.89512.73810.7567.4194.8093.5053.505
71-0.45-63.945-13.3108.16213.14911.0937.6034.8453.4503.450
72-0.40-64.244-13.3248.39613.47311.3647.7534.8713.3953.395
73-0.34-63.887-13.1668.59513.71611.5737.8724.8873.3403.340
74-0.29-62.968-12.8638.76113.88311.7237.9614.8953.2853.285
75-0.23-61.577-12.4398.89413.98111.8208.0224.8943.2303.230
76-0.18-59.792-11.9168.99514.01511.8658.0564.8843.1753.175
77-0.12-57.685-11.3129.06413.98911.8648.0644.8663.1203.120
78-0.06-55.321-10.6469.10313.90911.8198.0484.8403.0653.065
79-0.01-52.756-9.9339.11213.77911.7348.0094.8073.0103.010
800.05-50.043-9.1899.09313.60311.6117.9504.7662.9552.955
810.10-47.228-8.4249.04713.38711.4557.8704.7182.9002.900

(グラフ元データは以下略)

因みに

E56 =if($D56=0,$N$33,seriessum($D56,E$44-1,-1,E$33:$N$33))

の代わりに

E56 =if($D56=0,$N$33,seriessum($D56,E$44-1,-1,linest($D$4:$D$13,$F$4:$N$13)))

も可能。


できた散布図グラフを調整して完成。

ちゃんと10点を通ってて凄いと思う。でも表計算ソフト等は精密な計算には向いてないから、どんな場合でも通るかと言われればその保証はない。


linest関数は近似曲線(直線)を求めるためのものだと思うからこの使い方は邪道かも。n個の点を通る曲線を求めるのに便利そうだったので使ってみた。

seriessum関数は「べき級数」を求めるためのものだと思うからこの使い方は邪道かも。多項式用に便利そうだったので使ってみた。ただseriessum関数でべき級数の求め方を教えてくれるサイトは見つからなかったので自分でいろいろ試してみた。



ついで linest関数もseriessum関数も使わずに逆行列でやってみた。


{E19:N19} =ArrayFormula(transpose(mmult(minverse(E4:N13),D4:D13)))

{E20:M20} =ArrayFormula(transpose(mmult(minverse(E4:M12),D4:D12)))

{E21:L21} =ArrayFormula(transpose(mmult(minverse(E4:L11),D4:D11))) 以下略

B C D E F G H I J K L M N
18 逆行列を使用x^0の係数x^1の係数x^2の係数x^3の係数x^4の係数x^5の係数x^6の係数x^7の係数x^8の係数x^9の係数
1910p1~p10を通る9次関数4.00-59.95112.24-88.7437.63-9.381.42-0.130.010.00
209p1~p9を通る8次関数4.00-11.8524.27-21.279.18-2.140.28-0.020.00
218p1~p8を通る7次関数4.008.60-10.853.50-0.17-0.100.020.00
227p1~p7を通る6次関数4.0012.60-17.227.55-1.490.140.00
236p1~p6を通る5次関数4.009.17-12.254.79-0.750.04
245p1~p5を通る4次関数4.004.17-5.831.83-0.17
254p1~p4を通る3次関数4.000.17-1.500.33
263p1~p3を通る2次関数4.00-1.830.17
272p1~p2を通る1次関数4.00-1.50


272~281行は10個の点の座標、282行以下はn次曲線の散布図用データ

F282 =if($D282=0,$E$27,SUMPRODUCT($D282^(column($E$27:F$27)-5),$E$27:F$27))

G282 =if($D282=0,$E$26,SUMPRODUCT($D282^(column($E$26:G$26)-5),$E$26:G$26))

 (中略)

N282 =if($D282=0,$E$19,SUMPRODUCT($D282^(column($E$19:N$19)-5),$E$19:N$19))

F282:N282をF282:F492にコピペ。

BCDEFGHIJKLMN

269
seriessum関数不使用(逆行列の結果から)
270グラフ用2345678910
271010点のxの最小値xy(p1-p10)y(2点)y(3点)y(4点)y(5点)y(6点)y(7点)y(8点)y(9点)y(10点)
2721010点のxの最大値04
2731xの範囲の1割21
27420分割30
27542
27654
27765
27877
27988
28096
281100
282-0.254.3754.4693.8592.5640.865-0.3491.1188.85027.546
283-0.204.3004.3733.9042.9181.6370.7291.8197.52621.253
284-0.154.2254.2793.9403.2372.3331.6972.4556.40015.837
285-0.104.1504.1853.9683.5232.9562.5613.0285.45011.210
286-0.054.0754.0923.9883.7773.5103.3263.5434.6567.289
2870.000.0000.0000.0000.0000.0000.0000.0000.0000.000
2880.053.9253.9094.0054.1944.4284.5884.4033.4661.272
2890.103.8503.8184.0024.3604.7995.0954.7553.037-0.958
2900.153.7753.7293.9924.5005.1155.5275.0572.701-2.748
2910.203.7003.6403.9764.6145.3805.8885.3132.445-4.153
2920.253.6253.5523.9534.7055.5986.1855.5252.256-5.220
2930.303.5503.4653.9244.7735.7716.4215.6952.125-5.996
2940.353.4753.3793.8894.8205.9026.6015.8262.041-6.519
2950.403.4003.2933.8484.8465.9956.7295.9211.996-6.827
2960.453.3253.2093.8024.8546.0516.8105.9811.983-6.953
2970.503.2503.1253.7504.8446.0746.8486.0101.995-6.926
2980.553.1753.0423.6934.8176.0676.8456.0082.025-6.774
2990.603.1002.9603.6324.7746.0316.8075.9792.068-6.520
3000.653.0252.8793.5664.7175.9706.7355.9252.120-6.185
3010.702.9502.7983.4964.6475.8856.6345.8472.176-5.788
3020.752.8752.7193.4224.5645.7786.5075.7482.234-5.346
3030.802.8002.6403.3444.4705.6536.3565.6302.289-4.873
3040.852.7252.5623.2634.3665.5116.1845.4942.339-4.382
3050.902.6502.4853.1784.2525.3535.9955.3422.383-3.884
3060.952.5752.4093.0904.1305.1825.7905.1772.419-3.387
3071.002.5002.3333.0004.0005.0005.5715.0002.444-2.900

(グラフ元データは以下略)


できた散布図グラフを調整して完成。


2023.04.18 20:25公開 単純ミスなどは適宜修正済&修正予定

余談1

「表は貼り付け時の状態、グラフはドライブの元データを即反映」らしい。修正状態によっては齟齬が生じる恐れあり。


以下テスト用

0 件のコメント:

コメントを投稿