Autor Téma: Create Procedure - výpočet polynomu  (Přečteno 3746 krát)

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Create Procedure - výpočet polynomu
« kdy: 28-02-2014, 17:57:49 »
Ahoj

nedaří se mi přijít na to, jak realizovat výpočet. Pomocí

SELECT a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 FROM termoclanky WHERE (Typ = TcType AND Vmin <= Voltage AND Vmax >= Voltage);

získávám koeficienty z tabulky temoclanky potřebné pro výpočet teploty z naměřeného napětí. Samotný výpočet má vypadat takto:

teplota = a11 * voltage^11 + a10 * voltage ^10 + ..... + a1 * voltage + a0

zatím jsem přišel na toto:

create procedure nejak(IN Voltage float, OUT Teplota float)
begin
  set Teplota = 3 * Voltage;
end

Jak udělat výpočet, který získá koeficienty z tabulky pomocí SELECT?

Tuto teplotu chci pak vkládat do tabulky teplot, každé zařízení má svou.
MySQL ver. 5.6.11

hu


Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 567
  • Karma: 23
Re:Create Procedure - výpočet polynomu
« Odpověď #1 kdy: 28-02-2014, 23:15:43 »
Tak si dej ten select do procedury a načti do proměnných, viz select into v

https://dev.mysql.com/doc/refman/5.0/en/select-into.html

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Create Procedure - výpočet polynomu
« Odpověď #2 kdy: 03-03-2014, 11:48:57 »
V C++ aplikaci bych měl koeficienty a0 ... a11 v poli a počítal to v cyklu po jednotlivých členech od nejnižšího řádu. Stačilo by jen násobení a sčítání. Předpokládám, že by tento postup měl menší nároky na strojový čas.  Pokud jsem správně pochopil, zde pole nejsou.  Je způsob jak výpočet zrychlit? Přepsání polynomu do SQL asi nebude optimální...

hu

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1771
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:Create Procedure - výpočet polynomu
« Odpověď #3 kdy: 03-03-2014, 11:53:46 »
Ja z tveho dotazu nechapu, jestli to chces pocitac na strane Sql serveru nebo Delphi Clienta

Offline oxo

  • Guru
  • *****
  • Příspěvků: 690
  • Karma: 40
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Create Procedure - výpočet polynomu
« Odpověď #4 kdy: 03-03-2014, 11:56:41 »
Pro tvůj účel je nejlepší si napsat vlastní funkci pro MySQL v C:

http://dev.mysql.com/doc/refman/5.1/en/adding-udf.html
http://www.codeproject.com/Articles/15643/MySQL-User-Defined-Functions

+ Já jsem si podobně napsal vlastní rozšíření MySQL i v Delphi.
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Create Procedure - výpočet polynomu
« Odpověď #5 kdy: 03-03-2014, 13:22:04 »
Ja z tveho dotazu nechapu, jestli to chces pocitac na strane Sql serveru nebo Delphi Clienta
Cílem je uložená procedura (nebo funkce) MySQL, takže na straně serveru.

Na straně klienta bych použil FireDAC, koeficienty by se daly číst FDQuery1->Fields->Fields->AsFloat (požívám C++ Builder). Pak by výše popisované zpracování cyklem nebylo problém.

Psaní funkce se mi jeví jako příliš komplikované pro řešení tohoto problému. Navíc: Je možné volat SELECT uvnitř funkce?

Offline oxo

  • Guru
  • *****
  • Příspěvků: 690
  • Karma: 40
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Create Procedure - výpočet polynomu
« Odpověď #6 kdy: 03-03-2014, 14:32:22 »
Psaní funkce se mi jeví jako příliš komplikované pro řešení tohoto problému.

Záleží na úhlu pohledu. Ukázkový kód máš hotový, stačí ho upravit pro výpočet polynomu, což se mně jeví jako časově nenáročné.

Navíc: Je možné volat SELECT uvnitř funkce?

??? Napsal bysis pouze funkci pro výpočet polynomu z koeficientů a proměnné a tu bys zavolal nějak takhle:

Kód: [Vybrat]
SELECT POLYNOM11(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, Voltage) FROM termoclanky WHERE (Typ = TcType AND Vmin <= Voltage AND Vmax >= Voltage);

Mimochodem, polynom se programově nevypočítává po jednotlivých členech ale rozdělí se tak, aby se nekumulovalo násobení proměnné:
Kód: [Vybrat]
a0 + a1*x + a2*x^2 + a3*x^3 = a0 + x*(a1 + x*(a2 + x*a3))
« Poslední změna: 03-03-2014, 14:36:12 od oxo »
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Create Procedure - výpočet polynomu
« Odpověď #7 kdy: 03-03-2014, 15:18:59 »
 S tím vytýkáním mne to nenapadlo. 24 let po maturitě začínám mít mezery  :( Proceduru už se se mi podařilo udělat.

Založil jsem dll projekt a zkusil jsem zkompilovat jejich ukázkový příklad udf_example.c. Hlásí chybu:
Multiple declaration for SSIZE_T    v souboru basetsd.h(425)
Earlier declaration of SSIZE_T    v souboru _stddef.h
a ještě několik dalších. Si nevím vůbec rady.

Používám C++ Builder XE 5.

hu
« Poslední změna: 03-03-2014, 19:45:49 od hlucheucho »

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 567
  • Karma: 23
Re:Create Procedure - výpočet polynomu
« Odpověď #8 kdy: 03-03-2014, 22:31:57 »
Založil jsem dll projekt a zkusil jsem zkompilovat jejich ukázkový příklad udf_example.c. Hlásí chybu:

Proč v C? Tohle jde snad bez problému spočítat v té SQL funkci.

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Create Procedure - výpočet polynomu
« Odpověď #9 kdy: 04-03-2014, 08:41:27 »
Abych se to naučil. Nějaký návod jak na to použít C++ Builder jsem nenašel :(

hu

Offline oxo

  • Guru
  • *****
  • Příspěvků: 690
  • Karma: 40
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Create Procedure - výpočet polynomu
« Odpověď #10 kdy: 04-03-2014, 10:36:32 »
Abych pravdu řekl, C/C++ jsem na to nepoužíval. Napsal jsem si to v Delphi:
http://stackoverflow.com/questions/5894258/creating-a-udf-for-mysql-in-delphi
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1771
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:Create Procedure - výpočet polynomu
« Odpověď #11 kdy: 04-03-2014, 10:49:11 »
Abych pravdu řekl, C/C++ jsem na to nepoužíval. Napsal jsem si to v Delphi:
Evidentne nepouzivas C++ Builder, jako on  ;)

Jako vzor UDF pro FB se udava treba http://rfunc.sourceforge.net, ale ten site mi prijde nejak pochroumany, takze se mi nepovedlo dostat se ke zdrojovkam. Ty jsem nasel tady http://sourceforge.net/projects/rfunc/

Offline oxo

  • Guru
  • *****
  • Příspěvků: 690
  • Karma: 40
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Create Procedure - výpočet polynomu
« Odpověď #12 kdy: 04-03-2014, 11:10:31 »
S tím vytýkáním mne to nenapadlo. 24 let po maturitě začínám mít mezery  :( Proceduru už se se mi podařilo udělat.

Založil jsem dll projekt a zkusil jsem zkompilovat jejich ukázkový příklad udf_example.c. Hlásí chybu:
Multiple declaration for SSIZE_T    v souboru basetsd.h(425)
Earlier declaration of SSIZE_T    v souboru _stddef.h
a ještě několik dalších. Si nevím vůbec rady.

Používám C++ Builder XE 5.

hu

Jen horký tip:

Podle komentáře compileru tam máš 2 stejné definice pro SSIZE_T. Tak ty ze svého souboru (pravděpodobně basetsd.h) smaž.
Ten ukázkový kód bude asi pro ANSI C a to pravděpodobně SSIZE_T nezná (a C++ Builder ano), proto se to mlátí.
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Create Procedure - výpočet polynomu
« Odpověď #13 kdy: 04-03-2014, 21:02:36 »
Pravděpodobně basetsd.h je součástí windows.h.  Zkoušel jsem různá nastavení projektu a kompileru, vůbec mi to nepomohlo. Asi to dám k ledu  >:(

hu

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):