Permalänk
Medlem

App för att lösa en ekvation

Hej!

Jag behöver hjälp med att skapa en app/program för att lösa en relativt enkel ekvation. Ekvationen går ut på att beräkna riskavstånd för brandfarliga eller giftiga vätskor. Jag har gjort ett exceldokument för beräkningen men skulle helst vilja ha den som app i iPhone. Hur går man till väga? Går det att göra detta med relativt enkla medel, eller är det massor med programmeringsjobb för en sådan sak? Länken nedan visar en bild av hur ekvationen ser ut.

https://www.dropbox.com/s/pnqk0ju0xrrit28/Riskavst%C3%A5nd.jpg

Tacksam för hjälp!

Visa signatur

In a World gone mad, only a lunatic is truly insaine. -Homer J Simpson

Permalänk
Medlem
Permalänk
Medlem

Skulle rekommendera html och javascript för en sån simpel uträkning

Permalänk
Medlem

Jag har filat på en html/javascriptlösning och den ser i alla fall ut någotsånär som jag tänkt mig. Problemet är bara att den inte fungerar

Nån som kan hjälpa mig?

<!DOCTYPE html>
<html>
<head>
<title>Beräkningsmodell för Riskavstånd</title>
<script type="text/javascript">
function calcResult(){
document.getElementById('result').innerHTML = '';
var V = (document.getElementById('List').value);
var P = (document.getElementById('txt1').value);
var A = (document.getElementById('txt2').value);
var C = (document.getElementById('txt3').value);
if(isNaN(num1) || isNaN(num2)){
alert('One or both inputs are not a number');
} else {
document.getElementById('result').innerHTML = V*(Math.sqrt((P*A)/C));
}
}
window.onload=function(){
document.getElementById('btnCalc').onclick = calcResult;
}
</script>

</head>
<body>
<div>
<form>
Vindfaktor:
<select id="List" onchange="Vindfaktor()">
<option value="10">Vindstilla (< 3 m/s)</option>
<option value="30">Byig/måttlig vind (3-5 m/s) i vindriktningen</option>
<option value="40">Stabil/kraftig vind (10-15 m/s) i vindriktningen</option>
<option value="7.5">Byig/måttlig vind (3-5 m/s) mot vindriktningen</option>
<option value="4.5">Stabil/kraftig vind (10-15 m/s) mot vindriktningen</option>
</select><br />
P = Vätskans ångtryck (kPa) <input type="text" id="txt1" /><br />
A = Area (m2) <input type="text" id="txt2" /><br />
C = Koncentration (ppm) <input type="text" id="txt3" /><br />
<button id="btnCalc">Beräkna riskavstånd</button>
<div id="result">Riskavstånd</div>
</div>

</body>
</html>

Visa signatur

In a World gone mad, only a lunatic is truly insaine. -Homer J Simpson

Permalänk
Medlem

Vill du skapa en applikation för att räkna ut detta eller vill du ha ett programmeringsspråk som räknar ut detta?

Ska du utföra matematiska uträkningar och ekvationer så rekommenderar jag matlab eller mathematica. Blir bara krångligt om du ska hålla på med HTML/Javascript, även om det fungerar. Simplicitet är nyckeln. Om det är mycket kodande bakom en sådan applikation beror på hur duktig du är på det. En amatör/halvbra programmerare kan skriva flera invecklade rader medan en som är motsatsen kan skriva betydligt enklare, konkreta och smarta instruktioner för samma arbete.

Visa signatur

An expert is a man who has made all the mistakes which can be made, in a narrow field.
Niels Bohr

Permalänk
Hedersmedlem
Skrivet av ThorMas:

Jag har filat på en html/javascriptlösning och den ser i alla fall ut någotsånär som jag tänkt mig. Problemet är bara att den inte fungerar

Nån som kan hjälpa mig?

<!DOCTYPE html> <html> <head> <title>Beräkningsmodell för Riskavstånd</title> <script type="text/javascript"> function calcResult(){ document.getElementById('result').innerHTML = ''; var V = (document.getElementById('List').value); var P = (document.getElementById('txt1').value); var A = (document.getElementById('txt2').value); var C = (document.getElementById('txt3').value); if(isNaN(num1) || isNaN(num2)){ alert('One or both inputs are not a number'); } else { document.getElementById('result').innerHTML = V*(Math.sqrt((P*A)/C)); } } window.onload=function(){ document.getElementById('btnCalc').onclick = calcResult; } </script> </head> <body> <div> <form> Vindfaktor: <select id="List" onchange="Vindfaktor()"> <option value="10">Vindstilla (< 3 m/s)</option> <option value="30">Byig/måttlig vind (3-5 m/s) i vindriktningen</option> <option value="40">Stabil/kraftig vind (10-15 m/s) i vindriktningen</option> <option value="7.5">Byig/måttlig vind (3-5 m/s) mot vindriktningen</option> <option value="4.5">Stabil/kraftig vind (10-15 m/s) mot vindriktningen</option> </select><br /> P = Vätskans ångtryck (kPa) <input type="text" id="txt1" /><br /> A = Area (m2) <input type="text" id="txt2" /><br /> C = Koncentration (ppm) <input type="text" id="txt3" /><br /> <button id="btnCalc">Beräkna riskavstånd</button> <div id="result">Riskavstånd</div> </div> </body> </html>

Dold text

Det är en del problem där. Jag pillade ihop en variant som till synes fungerar, och kanske är enklare att bygga vidare på:

<!doctype html> <meta charset="utf-8"> <title>Beräkningsmodell för riskavstånd</title> <style> input[type="number"], select { display: block; margin-bottom: 1em; } .result {font-weight: bold;} </style> <form id="calculate_distance"> <fieldset> <legend>Beräkna riskavstånd</legend> <label>Vindfaktor <var>V</var>: <select id="wind" required> <option value="" disabled>— Välj vindfaktor —</option> <option value="10">Vindstilla (< 3 m/s)</option> <option value="30">Byig/måttlig vind (3–5 m/s) i vindriktningen</option> <option value="40">Stabil/kraftig vind (10–15 m/s) i vindriktningen</option> <option value="7.5">Byig/måttlig vind (3–5 m/s) mot vindriktningen</option> <option value="4.5">Stabil/kraftig vind (10–15 m/s) mot vindriktningen</option> </select> </label> <label> Vätskans ångtryck <var>P</var> /kPa: <input type="number" id="pressure" min="0" required> </label> <label> Area <var>A</var> /m²: <input type="number" id="area" min="0" required> </label> <label> Koncentration <var>C</var> /ppm: <input type="number" id="concentration" min="0" required> </label> <input type="submit" id="calculate" value="Beräkna"> </form> </fieldset> <p>Riskavstånd <var>R</var> = <var>V</var> √(<var>P</var> <var>A</var> / <var>C</var>) = <span id="distance" class="result">…</span> <script> function calculateDistance() { var V = document.getElementById('wind').value, P = document.getElementById('pressure').value, A = document.getElementById('area').value, C = document.getElementById('concentration').value, R = V * Math.sqrt(P*A/C); document.getElementById('distance').textContent = R.toFixed(2) + ' m'; } var distance_form = document.getElementById('calculate_distance'); distance_form.addEventListener('submit', function(e) { e.preventDefault(); calculateDistance(); }); </script>

Provkör varianten här [JSFiddle]

Kodnotiser

  • Jag har snålat en del med taggar som är valbara i HTML. Vissa tycker det ser kalt ut, men, tja; det får de tycka om de vill .

  • Det är alltid bra att ange teckenkodning via `meta charset`.

  • `input[type="number"]` är en attributväljare.

  • Jag tilldelar formuläret ett `id` att binda till en händelse för att senare utnyttja lite HTML5-godis på ett enkelt sätt.

  • `fieldset`/`legend` är ett sätt att tydligt visa vad som utgör ett visst formulär.

  • `label` hjälper dels med tillgänglighet för personer med skärmläsare och dylikt, men det ger också en större "klickyta" för tillhörande formulärelement.

  • `var` är en HTML5-tagg för att markera just variabelnamn. Bra sällan den kommer till användning, men den passar ju här .

  • Genom att sätta `required` på `input`-elementen så kommer webbläsaren själv säga till om ett fält inte är angett när "Beräkna"-knappen senare aktiveras; se Forms in HTML: Constraint validation. Just för `select`-elementet så lägger jag till ett placeholder-element genom att explicit ange ett tomt värde: användaren måste välja ett annat alternativ för att saker ska beräknas i ett senare steg.

  • Det är "farligt" att skriva tecknen <>& (och citationstecken inuti attributvärden) direkt i HTML-kod, då de kan misstolkas och exempelvis förstöra parsningsträdet för ett dokument. Bättre är att använda motsvarande HTML-entiteter: < > & (citationstecken: "). Detta gäller inte generellt för alla tecken som har specifika HTML-entiteter, men just dessa är lite "speciella" i och med deras fundamentala betydelser i HTML-kod.

  • `type="number"` gör att HTML5-valideringen klagar om det inte är något numeriskt som anges. Dessutom gör det att vissa läsare (men inte Firefox…) gör fältet till en så kallad "spinner", vilket ytterligare ger användaren en ledtråd om att ett nummer ska in där. Detta är speciellt användbart just för mobila läsare, eftersom detta attribut påverkar vilket virtuellt tangentbord som visas så att det passar inmatningsfältets typ. För att få en spinner även i Firefox kan man addera detta via förslagsvis JqueryUI, men det behövs nog inte här. Dive into HTML5: A form of madness är relaterad läsning med många exempel och utförliga förklaringar om man vill veta mer om nya HTML5-attribut i formulär.

  • Jag flyttar Javascriptet längst ned i filen. Det finns poänger med att låta läsaren tolka färdigt DOM-trädet innan skripten börjar appliceras och händelslyssnare registreras. Det finns även ytterligare poänger ifall man laddar externa filer.

  • Jag använder en snabbsyntax för att deklarera flera variabler samtidigt i Javascript.

  • Se exempelvis notisen på MDN om Element.innerHTML för varför `textContent` ofta är mer önskat än `innerHTML`.

  • `toFixed(2)` avrundar till två decimaler.

  • `addEventListener` är rekommenderat framför de gamla `onClick`-varianterna. Det är mer flexibelt och separerar skript från uppmärkning. Jag använder en anonym funktion som andra argument; `e` kommer innehålla "själva händelsen".

  • `e.preventDefault();` gör att vi faktiskt inte kommer skicka själva formuläret till servern, utan bara hantera det på klientsidan. Genom att det ändå är ett formulär så kommer HTML5-valideringen jobba innan vår anonyma funktion exekveras.

Vissa saker ovan kan krångla i vissa antika IE-versioner (gissar på IE <10), men om det är tänkt att användas i mobiler så bör det inte vara några problem.

Mindre viktiga formateringsnotiser

  • `doctype` behöver inte anges i versaler om man inte jobbar med XHTML, även om jag också länge gjorde det av gammal vana. För den intresserade finns mer diskussion att finna. Det skadar inte att ha versaler för den delen, men det är lite inkonsekvent i ljuset av att allt annat liknande skrivs med gemener.

  • Det syns kanske inte så tydligt ovan, men intervall betecknas vanligen med "en dash" (typ "tankstreck" på svenska, tror jag). Man kan använda entiteten `–`, men jag säger ju ändå att dokumentet är UTF-8-kodat, så man kan också skriva dessa tecken direkt.

  • Mellan ett mätetal och en enhet bör vitutrymmet dels inte vara "brytbart", dvs det ska inte ske några radbrytningar där, och dels bör det vara "lite mindre" än ett vanligt mellanslag. Ett icke-brytande tunt mellanrum uppfyller detta: U+202F. Det är alltså fortfarande mellanrum mellan tal och enheter ovan, men smalare.

  • Att definiera enhet genom att sätta ett "delat med" framför är ett matematiskt trevligt sätt. Då kan man läsa texten lite som en "ekvation", där enheterna stämmer så att man anger ett dimensionslöst tal i rutan (liknande resonemang appliceras med fördel på grafaxlar).

  • Jag antog att avståndet anges i enheten meter. Det beror på vilken enhet de olika vindfaktorerna har.

Dold text

Saker att förbättra

  • Det kanske kan vara trevligt att binda händelselyssnare direkt till fältförändring (`change`) efter att ha tryckt på "Beräkna" första gången för att slippa trycka på knappen igen ifall man ändrar någon uppgift, men det är inte självklart att det är bättre för en användare. Dessutom så är det lite lurigt att trigga HTML5-formulärvalideringen på klientsidan via Javascript: `.submit()` gör det inte, och ej heller `dispatchEvent` med en `submit`-event enligt mina tester (man kan trigga och läsa resultatet av själva kontrollen, men inte generera webbläsarens UI-notis vad jag vet). Man behöver nog simulera ett musklick på submit-knappen, vilket visserligen är görbart, om än lite oelegant.

  • Just nu kan man ange negativa tal, vilket nog inte är önskvärt: det är lätt att sätta ett minimum för `number`-fälten genom min-attributet för att hindra detta. En övning för läsaren . (Man kanske också vill undvika att C anges till 0 för att undvika oändligheten.)

  • Jag borde ha angett `disabled` på det förvalda alternativet i `select`, så att användaren inte åter kan välja detta. Ytterligare en övning för läsaren! (Exempelvis Firefox och Opera hoppar sonika över första alternativet och går direkt till nästa om det är `disabled`, vilket är lite dumt här, men "generellt" blir det nog bättre på mobiler. Chrome gör som det är tänkt enligt tester.)

  • Skriptet skulle kunna läggas i en extern fil som länkas in, och då samtidigt minimera kodinnehållet genom exempelvis Closure Compiler. Minimal laddningsskillnad i ett så här litet fall, men det är lätt att göra.

  • Javascriptet går att skriva effektivare (undvika att leta element i DOM vid varje funktionsanrop), men det lär inte bli något prestandaproblem i vilket fall. Kan vara en trevlig och enkel övning i closures att skriva om det på ett mer välordnat sätt, utan att implementera en massa globala namnrymdsentiteter (här är en version som bör vara snabbare genom att undvika global namnrymd samt multipla DOM-letningar och enklare för ovan nämnda Closure Compiler att optimera, men den är rätt kryptisk om man inte sett liknande tekniker tidigare).

  • Snyggare hantering av `NaN` och `Infinity`, men det hanteras redan för praktiska ändamål rätt OK. Ifall någon matar in "0" i fälten så kan de inte förvänta sig att få ett vettigt svar, men man skulle kunna presentera det på ett annat sätt än nu.

EDIT 2014-05-06: Jag har implementerat de överstrukna punkterna i koden ovan samt uppdaterat testsidan med dessa ändringar. Läsaren slipper dessa övningar.

Fysikfråga

  • Som nämndes ovan så blir saker oändliga om man anger koncentrationen till 0. Det kommer från formelns natur, men varför ser formeln ut som den gör gällande detta — varför minskar riskavståndet om koncentrationen ökar? Det låter intuitivt som att det borde vara tvärtom, men jag vet ju inte exakt vilka kvantiteter det är som ska mätas, så det är mycket möjligt helt i sin ordning.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Helt vansinnigt bra!! Fantastiskt stort tack för hjälpen!!

Jag ska försöka svara på din fysikfråga. Den här ekvationen är till för räddningspersonal som vid en olycka ska kunna på ett enkelt sätt bedöma riskavståndet för den faktiska händelsen och inte blint lita till insatsstöd där riskavstånden ofta är väl tilltagna. Läser man insatsstödet för exempelvis ammoniak som är ett väldigt giftigt ämne så anges riskzonen till 3000 m vid "stort utflöde". Stort utflöde är för övrigt inte preciserat så ingen vet hur mycket det är.

Om man istället använder formeln och antar att det är vindstilla, vilket ger ett cirkulärt riskområde. Sedan matar vi in ångtrycket som för ammoniak är 857 kPa vid 20 grader. Vi kan sedan anta att det är en pöl som är, låt säga 10m2. Koncentrationen som är intressant i detta fall är ett hygieniskt gränsvärde som kallas takgränsvärde. Detta värde talar om vilken koncentration en människa kan vistas i under 15 minuter utan att skadas. För ammoniak är det värdet 50 ppm. Detta talar om för oss att ca 131 m från utsläppet kan det finnas 50 ppm ammoniak i luften, ju närmare pölen vi kommer desto starkare blir alltså koncentrationen. Om vi matar in 100 ppm i formeln så är vi nere på 92,5 m.

Formeln kan även användas på brännbara vätskor. Vi tar bensin som exempel. Det är vindstilla, ångtrycket är 45 kPa, pölen är 10m2 och bensin har ett brännbarhetsområde mellan 0,6-8 vol%. Alltså, bensin kan antändas om det finns mellan 0,6 och 8 vol % i luften. Finns det mer så är blandningen för "fet" och bensinen kan inte antändas. Är koncentrationen mindre än 0,6 vol % är blandningen för "tunn" bensinen kan inte antändas. 0,6 vol % = 6000 ppm. Matar vi in dessa data i formeln så ser vi att riskavståndet är 2,74 m. Om det uppstår gnistor närmare än 3 m från den här pölen så finns det risk för antändning.

Hoppas att det besvarade frågan. Återigen, tack för hjälpen!

Visa signatur

In a World gone mad, only a lunatic is truly insaine. -Homer J Simpson

Permalänk
Hedersmedlem
Skrivet av ThorMas:

Koncentrationen som är intressant i detta fall är ett hygieniskt gränsvärde som kallas takgränsvärde. Detta värde talar om vilken koncentration en människa kan vistas i under 15 minuter utan att skadas.

Aha, ja, detta förklarar varför koncentrationen kommer in i formeln som den gör: det betecknade inte koncentrationen utav själva ämnet som jag först tänkte (då högre borde vara "farligare"), utan en specifik ämnesegenskap i form av ett gränsvärde där det är farligt (där ett lägre tal innebär att det krävs mindre av ämnet för att det ska vara farligt → lägre är farligare). Om man skulle ha ett ämne som var så farligt att man inte kunde vistas i dess närhet i 15 minuter även om koncentrationen var 0 så låter det rimligt att man behöver vara oändligt långt bort för att vara säker .

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem
Skrivet av phz:

Aha, ja, detta förklarar varför koncentrationen kommer in i formeln som den gör: det betecknade inte koncentrationen utav själva ämnet som jag först tänkte (då högre borde vara "farligare"), utan en specifik ämnesegenskap i form av ett gränsvärde där det är farligt (där ett lägre tal innebär att det krävs mindre av ämnet för att det ska vara farligt → lägre är farligare). Om man skulle ha ett ämne som var så farligt att man inte kunde vistas i dess närhet i 15 minuter även om koncentrationen var 0 så låter det rimligt att man behöver vara oändligt långt bort för att vara säker .

Helt riktigt

Visa signatur

In a World gone mad, only a lunatic is truly insaine. -Homer J Simpson