[PHP]scheikundige vergelijken oplossen

Pagina: 1
Acties:
  • 137 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 21-09 00:18
Ik ben bezig met het maken van een script om scheikundige vergelijkingen optelossen; dus dit formaat H2O + S -> H2O + S2( dat moet je dus kloppend maken, daarom is die ook 'fout' :) ). Nu dacht ik dat je dat met explode leuk kan 'exploden', door het op een leipe manier op te maken.

Maar dan loop je al vrij snel vast, je krijgt enorme arrays, die best ingewikkeld zijn om doortelopen, en de opmaak is verre van gebruikersvrienden.

Je zou ook regexen kunnen gebruiken, dacht ik, maar het moeilijike is dan, waarnaar kijk je...

Ik heb zelf totaal geen idee, hoe je zoeits zou aanpakken, en ik doe het eigenlijk alleen voor de lol en de ervaring...

Wat zou de beste methode zijn om dit aantepakken, die geen ondoorloopbare arrays creërt?

[ Voor 6% gewijzigd door simon op 05-02-2004 21:20 ]

|>


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Ik denk dat het nogal heel lastig gaat worden, gezien het feit dat stoffen allerlei verschillende mogelijke bindingen hebben, en je dus ook moet indexeren op covalenties. Niet elke reactie verloopt scheikundig gezien volgens een 'vaste' schema, te denken aan redoxreacties en evenwichtsreacties e.d. Ik weet niet in hoeverre het haalbaar is, maar iig veel succes.

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 19-09 22:18

chem

Reist de wereld rond

De syntax is behoorlijk eenvoudig... met een for() loopje heb je dat zo opgelost.
for( charloop ) {
if char != numeric
plaats char @ tmp ding
else
plaats tmp @ array met multiplier
}
go do some

dan nog een extra onthou ding omdat een getal > 1 char kan zijn, en klaar is Simon.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:44

gorgi_19

Kruimeltjes zijn weer op :9

Hmmmm.. Hoe ga je dan bepalen:

2H2O + S -> 2H2 + SO2
2H2O + S -> 2H2O + S

oftewel; hoe ga je kijken hoe iets reageert?

[ Voor 25% gewijzigd door gorgi_19 op 05-02-2004 21:13 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 21-09 00:18
prototype schreef op 05 februari 2004 @ 21:11:
Ik denk dat het nogal heel lastig gaat worden, gezien het feit dat stoffen allerlei verschillende mogelijke bindingen hebben, en je dus ook moet indexeren op covalenties. Niet elke reactie verloopt scheikundig gezien volgens een 'vaste' schema, te denken aan redoxreacties en evenwichtsreacties e.d. Ik weet niet in hoeverre het haalbaar is, maar iig veel succes.
Hmja, daar zat ik gister ook aan te denken. Zoiets leek me voor een deel 'opvangbaar' door daarop te checken. Maar de hoofdzaak is om ervaring op te doen, en het hoeft niet geheel kloppend te zijn, dan doe ik het liever 'zelf' :P

|>


Acties:
  • 0 Henk 'm!

  • Mithrandir
  • Registratie: Januari 2001
  • Laatst online: 21:22
H2O + S -> H2O + S2.

Je vergelijking klopt niet. Er staat aan de linkerkant van de pijl 1 S atoom en aan de rechterkant twee. Dan moet je gaan kijken wát je nou eigenlijk wilt gaan doen!

Wil je de opmaak gaan regelelen? Of alleen beginstoffen geven dat de computer moet uitzoeken wat je op het eind krijgt? Of puur controleren of de vergelijking goed is?

Verbouwing


Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 21-09 00:18
Mithrandir schreef op 05 februari 2004 @ 21:13:
H2O + S -> H2O + S2.

Je vergelijking klopt niet. Er staat aan de linkerkant van de pijl 1 S atoom en aan de rechterkant twee. Dan moet je gaan kijken wát je nou eigenlijk wilt gaan doen!

Wil je de opmaak gaan regelelen? Of alleen beginstoffen geven dat de computer moet uitzoeken wat je op het eind krijgt? Of puur controleren of de vergelijking goed is?
Het is dus de bedoelling, dat je die 2 kloppend maakt hé, daarom klopt die ook niet :P

Ik heb zo'n gevoel dat dit een mission impossible word :P

[ Voor 6% gewijzigd door simon op 05-02-2004 21:14 ]

|>


Acties:
  • 0 Henk 'm!

  • coubertin119
  • Registratie: Augustus 2002
  • Laatst online: 15-09 17:06
Je zoekt eerst op coëfficienten, daarna op gekende elementen en daarna op coëfficienten. Ik zou gewoon tekentje per tekentje bekijken wat het kan zijn, als het een integer is en voor een reeks van letters staat is het een coëfficient, is het een letter die een gekend element is kijk je naar de volgende letter om te kijken of dat ook geen gekend element oplevert enzo.

Gewoon wat logisch nadenken dus :).

Zeker geen Mission Impossible als je moleculen aan de linkerkant hebt, idem dito voor de rechterkant en je de juiste coëfficienten moet invullen. Ik heb hier al eens een voorbeeld in JS voor gezien, toen me voor chemie wat oefeningetjes moesten doen.

[ Voor 24% gewijzigd door coubertin119 op 05-02-2004 21:17 ]

Skat! Skat! Skat!


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

gorgi_19 schreef op 05 februari 2004 @ 21:12:
Hmmmm.. Hoe ga je dan bepalen:

2H2O + S -> 2H2 + SO2
2H2O + S -> 2H2O + S

oftewel; hoe ga je kijken hoe iets reageert?
Juist, bovendien moet je ook alle mogelijke combinaties tussen elementen gaan indexeren, CO, maar ook CO2, maar ook CO3, en H2CO3, en dan hebben we het nog niet over de eigenschappen van de stof zelf te denken aan fase en of (geconjugeerde) zuur/base eigenschappen.

Acties:
  • 0 Henk 'm!

  • AK47
  • Registratie: Juli 2001
  • Laatst online: 04-05-2024
Mithrandir > Dat zag ik ook meteen. Zijn voorbeeld reactie klopt totaal niet.

Simon > Idd, het lijkt mij persoonlijk ook onmogelijk. Of je moet zelf scheikunde leraar zijn die (bijna) alles van het verloop van reacties weten. Naast dat moet je ook een ongelofelijk groot/complex script bouwen waar je wel even mee bezig bent.

Acties:
  • 0 Henk 'm!

Verwijderd

Wat wil je nou precies? Het goed weergeven van idexen en .. euh...coeffiecenten (?) (dus verschil cijfer/letter[s]/cijfer) wat redelijk makkelijk te maken is (denk ik), of een vergelijking kloppend maken (wat redleijk onbegonnen werk is, tenzij je elke wet van scheikunde kent, zodat je precies kan uitrekenen wlke reactie op zal treden...)

Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 23:38

RayNbow

Kirika <3

Interessant maar best moeilijk probleem:

a H2O + b S -> c H2O + d S2

...heeft namelijk oneindig veel goede oplossingen:

(a,b,c,d) = (1, 2, 1, 1) of een veelvoud daarvan...

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Als het je alleen gaat om het in overstemming brengen van het aantal atomen dmv multipliers, dan is het te doen
1) De string parsen naar een AST
2) Vervolgens kun je het AST aflopen als een tree om zo de juiste factoren te vinden

Echter houd wel rekening ermee dat stap 2 complex is. Ik zie 1-2-3 niet hoe ik die zo snel zou kunnen oplossen, behalve met 'wat proberen'.

Gaat het je echter om de werkelijke scheikundige bewerking uit te rekenen die ontstaat bij
H2O + S2, dan zul je combinaties moeten aanleggen bijv in een database.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:43
Ik heb het idee dat een aantal mensen de bedoeling niet begrijpen. Misschien heb ik het fout, maar wat ik me kan herinneren van de middelbare school was dat het bij het kloppend maken van een reactievergelijking alleen om het toekennen van coëfficiënten gaat. Gegeven is dus bijvoorbeeld: a H2O + b S -> c H2O + d S2.

Het gaat er waarden toegekend worden a, b, c en d, zo, dat de atomen links en rechts overeen komen. Het is op die manier puur een wiskundige operatie en vereist verder helemaal geen kennis van zaken. In dit geval is een geldige allocatie bijvoorbeeld: a=1, b=2, c=1, d=1.

Zo'n oplossing kun je construeren met behulp van lineaire algebra. Het is de bedoeling dat aan elke kant hetzelfde aantal H's, O's en S'en staan, dus je kunt drie vergelijkingen op stellen: 2a - 2c = 0 (voor H), a - c = 0 (voor O) en b - 2d = 0 (voor S). Helaas zijn de eerste twee equivalent, dus dat is er maar eentje. Twee vergelijkingen en vier variabelen levert een tweedimensionale oplossingsruimte op. Handmatig oplossen doe je door (tweemaal) een willekeurige waarde voor een nieuwe variabele te kiezen. Bijvoorbeeld: a=1 (gekozen) betekent c=1 en d=1 (gekozen) betekent b = 2.

Er is ook een systematische methode om dit op te lossen met behulp van lineaire algebra. Vind iemand het interessant als ik daar verder op in ga?

edit:
RayNbow schreef op 05 februari 2004 @ 21:31:
Interessant maar best moeilijk probleem:
a H2O + b S -> c H2O + d S2
...heeft namelijk oneindig veel goede oplossingen:
(a,b,c,d) = (1, 2, 1, 1) of een veelvoud daarvan...
Niet alleen dat; ik gaf al aan dat de oplossingsruimte tweedimensionaal is. De algemene oplossing is dan ook [x, 2y, x, y], met willekeurige waarde voor x en y. (De oplossing die jij schetst geeft alleen die oplossingen met x=y).

Trouwens, als het de bedoeling is dat minimale gehele coëfficienten gegeven worden, het je hooguit 1 oplossing per probleem. Verder neem ik aan dat de bedoeling van het script is om te oefenen met scheikundeopgaven op middelbare school-nivo; dat is gelukkig vrij makkelijk te brute-forcen.

[ Voor 31% gewijzigd door Soultaker op 05-02-2004 21:56 ]


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Soultaker schreef op 05 februari 2004 @ 21:52:
Er is ook een systematische methode om dit op te lossen met behulp van lineaire algebra. Vind iemand het interessant als ik daar verder op in ga?
Altijd, ik ben gisteren al even aan het denken geweest, maar helemaal kwam ik er niet uit. Voornamelijk omdat ik vorig jaar misschien een beetje 'vergeten' ben naar lineare algebra colleges te gaan :P

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 21-09 00:18
Kijk jij snapt 't :P

Dat is dus het idee, aan de hand van de wet van Lavoisser..

Maar ik heb geen flauw idee, hoe ik het precies zou moeten opsplitten...

|>


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Er is ook een systematische methode om dit op te lossen met behulp van lineaire algebra. Vind iemand het interessant als ik daar verder op in ga?
*knikt* :)

edit:
Ik heb overigens wel een vermoeden, maar lineaire algebra heb ik nog niet meer dan 1 inleidend hoofdstukje over mogen genieten...

't zal ongeveer in deze richting zitten (afgezien van scheikundige correctheid)

je drukt alle variabelen links van de vergelijking uit in de variabelen rechts van de vergelijking per atoom. Vervolgens heb je een stel lineaire vergelijkingen in x vlakken, waarbij het aantal vlakken bepaald wordt door het aantal combinaties van 2 van het aantal verschillende atomen te nemen (n boven 2). Vervolgens moet je in elk van die vlakken op zoek naar de snijpunten van de vergelijkingen en tot slot uit de oplossingsverzameling de ideale situatie uitkiezen. Dat kiezen gaat makkelijk omdat de variabelen allemaal in |N moeten zitten...

zoiets :?

edit:
permutaties != combinaties |:(

[ Voor 77% gewijzigd door drm op 06-02-2004 15:54 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • R4NCOR
  • Registratie: December 2000
  • Laatst online: 16-09 12:26

R4NCOR

eigenlijk gewoon Niels

Als alleen de reactie kloppend gemaakt moet worden is het helemaal niet zo moeilijk lijkt me :)

Gewoon per character kijken wat er staat. Of wil je het de gebruiker in laten voeren in een formulier? Dan heb je het nog gemakkelijker.

Gewoon aan beide kanten de atomen tellen.

Enige waar dan nog rekening mee gehouden moet worden is dat je deze 2 atomen uit elkaar kan houden: F en Fe, niet dat je de eerste letter van ijzer aan gaat zien voor een F-atoom :)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

daarom wordt Fe ook geschreven als Fe en niet FE (hint hint)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • BestTested!
  • Registratie: Oktober 2003
  • Laatst online: 18:54
Simon schreef op 06 februari 2004 @ 15:09:
[...]

Kijk jij snapt 't :P

Dat is dus het idee, aan de hand van de wet van Lavoisser..

Maar ik heb geen flauw idee, hoe ik het precies zou moeten opsplitten...
Hummm, lees net het topic en zeker interessant aangezien ik net een blok Lineaire Algebra heb afgerond. (Helaas wel gezakt voor tentamen vrees ik).

Het oplossen is niet echt moeilijk. Gewoon een stelsel vergelijkingen opstellen, dan in een matrix gooien. Dan kan je met Gauss-eliminatie de a,b,c, etc vinden. Wordt alleen wel lastig als je een inconsistent systeem hebt. Dan vind je geen oplossing. Of wat te doen met meerdere mogelijke antwoorden (dus Dim(Col(Matrix A)) < aantal variabelen). Dan krijg je dus een Null-ruimte, met een span{v1, v2, v3}.

Heb hier nog wel een boekje staan over Lineaire Algebra, eens even kijken of ik nog iets kan vinden (weet dat er heel veel praktijk voorbeelden instaan).

Veel succes i.i.g

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het is ook een beetje een krom voorbeeld, want de vergelijking is hier gewoon 2 S -> S2, de H2O komt er helemaal niet in voor (links en rechts beide 1, dus je kunt ze wegstrepen)

Ik denk dat je iig voor je uitleg beter een ander voorbeeld kunt gebruiken, bijvoorbeeld de verbranding van methaan

  p CH4 + q O2 -> x H2O + y CO2

Dan heb je ook een veel mooiere vergelijking waarbij de variabelen meer van elkaar afhankelijk zijn

y = p = (2q-x)/2
x = p/2 = 2q - 2y

q = (2p+x)/2 = p + x/2 = y + x/2 = p/4 + y


.edit: foutje gemaakt |:(

y = p
x = 2p
q = (x + 2y) / 2 = (2p + 2p) / 2 = 2p

Alles zijn dus veelvouden van p, dus we kunnen p=1 nemen en de rest gewoon uitrekenen

CH4 + 2 O2 -> 2 H2O + CO2

[ Voor 17% gewijzigd door .oisyn op 06-02-2004 19:00 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

.oisyn:
daarom wordt Fe ook geschreven als Fe en niet FE (hint hint)
:P dat mag duidelijk zijn, idd :)

Heb overigens even wat in mekaar geprutst: http://gerard.yoursite.nl/got/Simon/eq-check.php

De source krijg je niet, want dan wordt .oisyn boos dat ik scriptrequests aanmoedig :+. Maar als ik 't in een halfuurtje tijd kan schrijven dan kan ieder ander het :Y)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat is alleen maar het inlezen, nu nog oplossen ;)

[ Voor 9% gewijzigd door .oisyn op 06-02-2004 18:30 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

.oisyn:
Dat is alleen maar het inlezen, nu nog oplossen ;)
Weet ik, daarvoor wacht ik nog op de reply van Soultaker :P

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
drm schreef op 06 februari 2004 @ 18:08:
Heb overigens even wat in mekaar geprutst: http://gerard.yoursite.nl/got/Simon/eq-check.php

De source krijg je niet, want dan wordt .oisyn boos dat ik scriptrequests aanmoedig :+. Maar als ik 't in een halfuurtje tijd kan schrijven dan kan ieder ander het :Y)
Ha, 17:29 hier :+
Omdat ik de lulligste niet ben, is hier de source voor de topicstarter:
Haskell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
module Test where

import ParseLib

{-
        EBNF
        Everything between single quotes are string constants
        () are used for gouping
        UChar = uppercase character
        LChar = lowercase character
        
EQUATION        = EXPR WS? '->' WS? EXPR

EXPR            = N? WS? MOL WS? EXPRS
EXPRS           = '+' WS? EXPR
EXPRS           = epsilon

MOL             = (ELEM N?)+

N               = Int
WS              = ' '*
ELEM            = UChar LChar*
-}

{-
        Abstract Syntax
-}
type Equation   = ( Expr, Expr )

type Expr       = [ SubExpr ]

type SubExpr    = ( N, Mol )
 
type Mol        = [ ( Elem, N ) ]

type N          = Int

type Elem       = String

{- 
        Parsers
-}

pEquation       :: Parser Char Equation
pEquation       = (\e1 w1 sep w2 e2 -> (e1, e2) ) <$>
                        pExpr      <*> pWSpace <*>
                        token "->" <*> pWSpace <*>
                        pExpr

pExpr           :: Parser Char Expr
pExpr           = listOf1 pSubExpr ( (\s w -> s) <$> symbol '+' <*> pWSpace )

pSubExpr        :: Parser Char SubExpr
pSubExpr        = (\n w1 m w2 -> (n, m) ) <$>
                        option pNatural 1 <*> pWSpace <*> pMol <*> pWSpace
                        
pMol            :: Parser Char Mol
pMol            = many1 ( (\e n -> (e,n)) <$>
                                pElem <*> option pNatural 1
                        )

pElem           :: Parser Char Elem
pElem           = (:) <$> satisfy isUpper <*> greedy (satisfy isLower)

pNatural        :: Parser Char N
pNatural        = natural

pWSpace         :: Parser Char String
pWSpace         = greedy $ satisfy (==' ')

{-
        Pretty Printer
-}

ppEquation              :: Equation -> String
ppEquation (l, r)       = ppExpr l ++ " -> " ++ ppExpr r

ppExpr                  :: Expr -> String
ppExpr                  = concat.separate ( ++ " + ").map ppSubExpr

ppSubExpr               :: SubExpr -> String
ppSubExpr (n, m)        | n == 0        = ""
                        | n == 1        = ppMol m
                        | otherwise     = ppNatural n ++ " " ++ ppMol m
                                
ppMol                   :: Mol -> String
ppMol                   = concatMap f
                        where f ( elem, num )   | num == 0  = ""
                                                | num == 1  = elem
                                                | otherwise = elem ++ ppNatural num

ppNatural               :: N -> String
ppNatural n             = show n

{-
        Helper function
-}
separate                :: (a -> a) -> [a] -> [a]
separate f [x]          = [x]
separate f (x:xs)       = f x :separate f xs


Ja, dit was een verkapte kick, maar wel orgineel niet? :+

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Ja, maar er staat toch duidelijk [PHP] in de topictitel :+

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1