initial commit
This commit is contained in:
commit
784b1b8a34
23
.gitignore
vendored
Normal file
23
.gitignore
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#### joe made this: http://goel.io/joe
|
||||||
|
#### haskell ####
|
||||||
|
dist
|
||||||
|
dist-*
|
||||||
|
cabal-dev
|
||||||
|
*.o
|
||||||
|
*.hi
|
||||||
|
*.chi
|
||||||
|
*.chs.h
|
||||||
|
*.dyn_o
|
||||||
|
*.dyn_hi
|
||||||
|
.hpc
|
||||||
|
.hsenv
|
||||||
|
.cabal-sandbox/
|
||||||
|
cabal.sandbox.config
|
||||||
|
*.prof
|
||||||
|
*.aux
|
||||||
|
*.hp
|
||||||
|
*.eventlog
|
||||||
|
.stack-work/
|
||||||
|
cabal.project.local
|
||||||
|
.HTF/
|
||||||
|
|
101
LICENSE
Normal file
101
LICENSE
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
the GNU General Public License is intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users. We, the Free Software Foundation, use the
|
||||||
|
GNU General Public License for most of our software; it applies also to
|
||||||
|
any other work released this way by its authors. You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to prevent others from denying you
|
||||||
|
these rights or asking you to surrender the rights. Therefore, you have
|
||||||
|
certain responsibilities if you distribute copies of the software, or if
|
||||||
|
you modify it: responsibilities to respect the freedom of others.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must pass on to the recipients the same
|
||||||
|
freedoms that you received. You must make sure that they, too, receive
|
||||||
|
or can get the source code. And you must show them these terms so they
|
||||||
|
know their rights.
|
||||||
|
|
||||||
|
Developers that use the GNU GPL protect your rights with two steps:
|
||||||
|
(1) assert copyright on the software, and (2) offer you this License
|
||||||
|
giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
|
||||||
|
For the developers' and authors' protection, the GPL clearly explains
|
||||||
|
that there is no warranty for this free software. For both users' and
|
||||||
|
authors' sake, the GPL requires that modified versions be marked as
|
||||||
|
changed, so that their problems will not be attributed erroneously to
|
||||||
|
authors of previous versions.
|
||||||
|
|
||||||
|
Some devices are designed to deny users access to install or run
|
||||||
|
modified versions of the software inside them, although the manufacturer
|
||||||
|
can do so. This is fundamentally incompatible with the aim of
|
||||||
|
protecting users' freedom to change the software. The systematic
|
||||||
|
pattern of such abuse occurs in the area of products for individuals to
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we
|
||||||
|
have designed this version of the GPL to prohibit the practice for those
|
||||||
|
products. If such problems arise substantially in other domains, we
|
||||||
|
stand ready to extend this provision to those domains in future versions
|
||||||
|
of the GPL, as needed to protect the freedom of users.
|
||||||
|
|
||||||
|
Finally, every program is threatened constantly by software patents.
|
||||||
|
States should not allow patents to restrict development and use of
|
||||||
|
software on general-purpose computers, but in those that do, we wish to
|
||||||
|
avoid the special danger that patents applied to a free program could
|
||||||
|
make it effectively proprietary. To prevent this, the GPL assures that
|
||||||
|
patents cannot be used to render the program non-free.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy,
|
68
README.md
Normal file
68
README.md
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
slope-field
|
||||||
|
===========
|
||||||
|
|
||||||
|
I was studying [this course on Integration](https://www.edx.org/course/calculus-1b-integration-mitx-18-01-2x) when I encountered
|
||||||
|
slope fields and I found them interesting!
|
||||||
|
|
||||||
|
So I thought I would give it a shot and try to write a program to draw slope fields myself!
|
||||||
|
In order to read a mathematical function definition from input, I wrote [mathexpr](/mdibaiee/mathexpr).
|
||||||
|
|
||||||
|
Get Started
|
||||||
|
-----------
|
||||||
|
If you don't already, install [Haskell Platform](https://www.haskell.org/platform/).
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone https://github.com/mdibaiee/slope-field
|
||||||
|
cd slope-field
|
||||||
|
stack install
|
||||||
|
slope-field
|
||||||
|
```
|
||||||
|
Examples
|
||||||
|
--------
|
||||||
|
Parameters:
|
||||||
|
- dy/dx: derivative of the function you are trying to visualize
|
||||||
|
- range: range of numbers to draw
|
||||||
|
- estimation size: size of `deltax` which is used to draw the slope corresponding to a small point, `0.03` is usually a good number, but you might want to try out larger numbers to get a more detailed picture on some examples
|
||||||
|
```
|
||||||
|
dy/dx =
|
||||||
|
x + y
|
||||||
|
range - format: (lower, upper):
|
||||||
|
(-10, 10)
|
||||||
|
estimation size:
|
||||||
|
0.03
|
||||||
|
```
|
||||||
|
|
||||||
|
![x plus y](https://github.com/mdibaiee/slope-field/blob/master/xpy.png?raw=true)
|
||||||
|
|
||||||
|
```
|
||||||
|
dy/dx =
|
||||||
|
x * y
|
||||||
|
range - format: (lower, upper):
|
||||||
|
(-10, 10)
|
||||||
|
estimation size:
|
||||||
|
0.03
|
||||||
|
```
|
||||||
|
|
||||||
|
![x times y](https://github.com/mdibaiee/slope-field/blob/master/xty.png?raw=true)
|
||||||
|
|
||||||
|
```
|
||||||
|
dy/dx =
|
||||||
|
-y
|
||||||
|
range - format: (lower, upper):
|
||||||
|
(-10, 10)
|
||||||
|
estimation size:
|
||||||
|
0.03
|
||||||
|
```
|
||||||
|
|
||||||
|
![minus y](https://github.com/mdibaiee/slope-field/blob/master/minusy.png?raw=true)
|
||||||
|
|
||||||
|
```
|
||||||
|
dy/dx =
|
||||||
|
y/x
|
||||||
|
range - format: (lower, upper):
|
||||||
|
(-10, 10)
|
||||||
|
estimation size:
|
||||||
|
0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
![y divided by x](https://github.com/mdibaiee/slope-field/blob/master/ydx.png?raw=true)
|
37
app/Main.hs
Normal file
37
app/Main.hs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
{-# LANGUAGE ScopedTypeVariables #-}
|
||||||
|
|
||||||
|
module Main where
|
||||||
|
import Lib
|
||||||
|
import System.IO
|
||||||
|
import Graphics.Rendering.Chart
|
||||||
|
import Graphics.Rendering.Chart.Backend.Cairo
|
||||||
|
import Control.Lens
|
||||||
|
import Data.Default.Class
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
putStrLn "dy/dx = "
|
||||||
|
math <- getLine
|
||||||
|
putStrLn "range - format: (lower, upper): "
|
||||||
|
(lower, upper) :: (Int, Int) <- read <$> getLine
|
||||||
|
putStrLn "estimation size: "
|
||||||
|
s <- read <$> getLine
|
||||||
|
|
||||||
|
let pts = points (lower, upper)
|
||||||
|
field = slopeField math pts s
|
||||||
|
|
||||||
|
let chart = toRenderable layout
|
||||||
|
where
|
||||||
|
layout = layout_title .~ "slope field"
|
||||||
|
$ layout_plots .~ [vectors]
|
||||||
|
$ def
|
||||||
|
|
||||||
|
vectors = plotVectorField
|
||||||
|
$ plot_vectors_values .~ field
|
||||||
|
$ plot_vectors_scale .~ 0
|
||||||
|
$ plot_vectors_style . vector_head_style . point_radius .~ 0
|
||||||
|
$ def
|
||||||
|
|
||||||
|
renderableToFile def "slope-field.png" chart
|
||||||
|
putStrLn "created file slope-field.png"
|
||||||
|
return ()
|
BIN
minusy.png
Normal file
BIN
minusy.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
38
slope-field.cabal
Normal file
38
slope-field.cabal
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
name: slope-field
|
||||||
|
version: 0.1.0.0
|
||||||
|
synopsis: Visualize mathematical function's slope fields
|
||||||
|
description: Visualize mathematical function's slope fields
|
||||||
|
homepage: https://github.com/mdibaiee/slope-field
|
||||||
|
license: GPL-3
|
||||||
|
license-file: LICENSE
|
||||||
|
author: Mahdi Dibaiee
|
||||||
|
maintainer: mdibaiee@aol.com
|
||||||
|
copyright: 2016 Mahdi Dibaiee
|
||||||
|
category: Web
|
||||||
|
build-type: Simple
|
||||||
|
-- extra-source-files:
|
||||||
|
cabal-version: >=1.10
|
||||||
|
|
||||||
|
library
|
||||||
|
hs-source-dirs: src
|
||||||
|
exposed-modules: Lib
|
||||||
|
build-depends: base >= 4.7 && < 5
|
||||||
|
, mathexpr >= 0.3.0.0
|
||||||
|
, data-default-class
|
||||||
|
default-language: Haskell2010
|
||||||
|
|
||||||
|
executable slope-field
|
||||||
|
hs-source-dirs: app
|
||||||
|
main-is: Main.hs
|
||||||
|
ghc-options: -threaded -rtsopts -with-rtsopts=-N
|
||||||
|
build-depends: base
|
||||||
|
, slope-field
|
||||||
|
, Chart
|
||||||
|
, Chart-cairo
|
||||||
|
, lens
|
||||||
|
, data-default-class
|
||||||
|
default-language: Haskell2010
|
||||||
|
|
||||||
|
source-repository head
|
||||||
|
type: git
|
||||||
|
location: https://github.com/mdibaiee/slope-field
|
21
src/Lib.hs
Normal file
21
src/Lib.hs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
module Lib
|
||||||
|
( points
|
||||||
|
, slopeField
|
||||||
|
) where
|
||||||
|
import Numeric.MathExpr
|
||||||
|
import Data.Default.Class
|
||||||
|
|
||||||
|
type Range = (Int, Int)
|
||||||
|
|
||||||
|
points :: Range -> [(Double, Double)]
|
||||||
|
points (lower, upper) =
|
||||||
|
let range = [lower..upper]
|
||||||
|
in [ (fromIntegral x, fromIntegral y) | x <- range, y <- range ]
|
||||||
|
|
||||||
|
slopeField :: String -> [(Double, Double)] -> Double -> [((Double, Double), (Double, Double))]
|
||||||
|
slopeField math pts diff =
|
||||||
|
let d x y = evaluate def math [("x", x), ("y", y)]
|
||||||
|
half = diff / 2
|
||||||
|
res = map (\(x, y) -> ((x - half, y), (half, d x y * diff))) pts
|
||||||
|
inf = 1/0
|
||||||
|
in filter (\((x0, y0), (x, y)) -> x < inf && y < inf && x > -inf && y > -inf) res
|
68
stack.yaml
Normal file
68
stack.yaml
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
# This file was automatically generated by 'stack init'
|
||||||
|
#
|
||||||
|
# Some commonly used options have been documented as comments in this file.
|
||||||
|
# For advanced use and comprehensive documentation of the format, please see:
|
||||||
|
# http://docs.haskellstack.org/en/stable/yaml_configuration/
|
||||||
|
|
||||||
|
# Resolver to choose a 'specific' stackage snapshot or a compiler version.
|
||||||
|
# A snapshot resolver dictates the compiler version and the set of packages
|
||||||
|
# to be used for project dependencies. For example:
|
||||||
|
#
|
||||||
|
# resolver: lts-3.5
|
||||||
|
# resolver: nightly-2015-09-21
|
||||||
|
# resolver: ghc-7.10.2
|
||||||
|
# resolver: ghcjs-0.1.0_ghc-7.10.2
|
||||||
|
# resolver:
|
||||||
|
# name: custom-snapshot
|
||||||
|
# location: "./custom-snapshot.yaml"
|
||||||
|
resolver: lts-7.6
|
||||||
|
|
||||||
|
# User packages to be built.
|
||||||
|
# Various formats can be used as shown in the example below.
|
||||||
|
#
|
||||||
|
# packages:
|
||||||
|
# - some-directory
|
||||||
|
# - https://example.com/foo/bar/baz-0.0.2.tar.gz
|
||||||
|
# - location:
|
||||||
|
# git: https://github.com/commercialhaskell/stack.git
|
||||||
|
# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
|
||||||
|
# - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a
|
||||||
|
# extra-dep: true
|
||||||
|
# subdirs:
|
||||||
|
# - auto-update
|
||||||
|
# - wai
|
||||||
|
#
|
||||||
|
# A package marked 'extra-dep: true' will only be built if demanded by a
|
||||||
|
# non-dependency (i.e. a user package), and its test suites and benchmarks
|
||||||
|
# will not be run. This is useful for tweaking upstream packages.
|
||||||
|
packages:
|
||||||
|
- '.'
|
||||||
|
- '../mathexpr'
|
||||||
|
# Dependency packages to be pulled from upstream that are not in the resolver
|
||||||
|
# (e.g., acme-missiles-0.3)
|
||||||
|
extra-deps:
|
||||||
|
- mathexpr-0.3.0.0
|
||||||
|
|
||||||
|
# Override default flag values for local packages and extra-deps
|
||||||
|
flags: {}
|
||||||
|
|
||||||
|
# Extra package databases containing global packages
|
||||||
|
extra-package-dbs: []
|
||||||
|
|
||||||
|
# Control whether we use the GHC we find on the path
|
||||||
|
# system-ghc: true
|
||||||
|
#
|
||||||
|
# Require a specific version of stack, using version ranges
|
||||||
|
# require-stack-version: -any # Default
|
||||||
|
# require-stack-version: ">=1.1"
|
||||||
|
#
|
||||||
|
# Override the architecture used by stack, especially useful on Windows
|
||||||
|
# arch: i386
|
||||||
|
# arch: x86_64
|
||||||
|
#
|
||||||
|
# Extra directories used by stack for building
|
||||||
|
# extra-include-dirs: [/path/to/dir]
|
||||||
|
# extra-lib-dirs: [/path/to/dir]
|
||||||
|
#
|
||||||
|
# Allow a newer minor version of GHC than the snapshot specifies
|
||||||
|
# compiler-check: newer-minor
|
2
test/Spec.hs
Normal file
2
test/Spec.hs
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
main :: IO ()
|
||||||
|
main = putStrLn "Test suite not yet implemented"
|
Loading…
Reference in New Issue
Block a user