Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Lukumuutosten suuntaus

JussiR [26.08.2010 19:51:15]

#

Moi,

Jos mulla on luvut "5000,5010,5015,5020,5025,5035,5046,5030,5084,5100,5120,5180,5260,5250,5255,5265,5275,5290" (kaavio 1), niin mikä olisi paras tapa "tunnistaa" lukujen kasvusuunta vaikka nyt aluksi kolmen viimeisen luvun perusteella?
Eli noiden jälkeen tulisi jotain tälläistä: "5310,5335,5370" (kaavio 2), eli suuntaus olisi kiihtyvä ja isommaksi, kuten kaavioista näkyy: http://img831.imageshack.us/img831/159/kaaviot.png

Onko jotain kaavaa jo olemassa tälläiselle? Ja jos ei niin olisko jotain vinkkiä miten tälläinen kannattaa toteuttaa?

EDIT: Ei se ehkä ihan noin kiihtyvä olisi, mutta ymmärsitte varmaan kuitenkin mitä meinaan. Ja tarkoitus on tehdä VB6:lla, jos se jotain kiinnostaa.. Tää varmaan kuuluis johonkin toiselle alueelle?

Antti Laaksonen [26.08.2010 20:01:09]

#

Jos luvut ovat a, b ja c, voit laskea esim. näin:

s = c - b (suunta)
m = (c - b) - (b - a) (muutos)

Sitten seuraavat luvut ovat:

d = c + (s + m)
e = c + (s + m) + (s + 2 * m)
f = c + (s + m) + (s + 2 * m) + (s + 3 * m)

Esim.

a = 5265
b = 5275
c = 5290
s = 15
m = 5
d = 5310
e = 5335
f = 5365

JussiR [26.08.2010 21:25:34]

#

Tein tämmösen VB:llä

Private Sub Form_Load()
Dim a As Integer, b As Integer, d As Integer, e As Integer, f As Integer, s As Integer, m As Integer
a = InputBox("Luku 1:")
b = InputBox("Luku 2:")
c = InputBox("Luku 3:")

s = c - b
m = (c - b) - (b - a)



d = c + (s + m)
e = c + (s + m) + (s + 2 * m)
f = c + (s + m) + (s + 2 * m) + (s + 3 * m)

MsgBox d & ", " & e & ", " & f
End Sub

Mitenköhän tuota pitäis muuttaa että noiden lukujen määrä voisi olla rajaton? Sekä noiden "ennusteiden" että aiempien lukujen (jotka on nyt nuo a, b ja c). Menee monimutkaiseksi..

Tuo ei muuten toimi, jos suuntaus on alaspäin, mutta se on helppo korjata. Syötin luvut "6585,6526,6526" ja vastaukseksi sain "6585,6703,6880".

Metabolix [26.08.2010 23:22:01]

#

Kysymyksesi on aika epätarkka. Jotta käyrän jatkoa voisi arvioida järkevästi, pitäisi pystyä tekemään jonkinlaisia oletuksia sen luonteesta. Onko käyrä pääasiassa suora (tasaisesti kasvava), paraabeli (kuten Antti oletti), eksponenttifunktio vai jotain muuta?

Kun olet tehnyt valintasi, muodosta funktio, joka tuottaa halutunlaisen käyrän. Esimerkiksi eksponenttifunktio voisi olla muotoa
f(x) = exp(a * x + b),
missä a ja b ovat vakiot.

Sitten jälkeen tarvitsee enää valita tarpeeksi monta tunnettua kohtaa kuvaajalta, jotta saa vakiot ratkaistua. Tämä on ihan tavallista yhtälönratkaisua. Kahden viimeisen perusteella saataisiin seuraavaa:

f(17) = exp(a * 17 + b) = 5275
f(18) = exp(a * 18 + b) = 5290

Välivaiheet tulevat läksyksi!

Tarkka vastaus:
a = ln(5290) - ln(5275)
b = ln(5275) * 18 - ln(5290) * 17

Likiarvot:
a = 0,002840  (1 / a = 352,2)
b = 8,522

Kannattaa harkita myös jonkin muun kuin kahden viimeisen arvon käyttöä; jos näistä jompikumpi sattuisikin olemaan vähän pielessä, käyrästä voisi tulla hyvinkin jyrkkä tai vaikka laskeva.

Nyt voidaan joka tapauksessa laskea mikä tahansa luku:

f(x) = exp(a * x + b)
f(1) = 5040.70
f(2) = 5055.04
f(3) = 5069.41
...
f(16) = 5260.04
f(17) = 5275.00
f(18) = 5290.00
f(19) = 5305.04
f(20) = 5320.13
...
f(30) = 5473.36
f(40) = 5631.01
f(50) = 5793.20

Kuten huomaat, ainoat jokseenkin tarkat arvot ovat ne kaksi, joita käytettiin laskuissa; alkupäästään käyrä poikkeaa huomattavastikin tunnetuista arvoista. Loppupää kuitenkin vastaa vaatimuksiasi eli kasvaa aavistuksen kiihtyvästi. Tuloksia voi parantaa kokeilemalla useampaa eri käyrää ja valitsemalla sen, joka vastaa tunnettuja lukuja parhaiten.

groovyb [27.08.2010 11:57:23]

#

Onnistuisikohan jos tekisi while loopin inputbox kyselyille, ja laskisi tulosten välistä (tai useiden tulosten summien välisiä) kulmakertoimia?

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta