init
This commit is contained in:
17
Pipfile
Normal file
17
Pipfile
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
[[source]]
|
||||||
|
url = "https://pypi.org/simple"
|
||||||
|
verify_ssl = true
|
||||||
|
name = "pypi"
|
||||||
|
|
||||||
|
[packages]
|
||||||
|
numpy = "*"
|
||||||
|
scipy = "*"
|
||||||
|
sympy = "*"
|
||||||
|
pytest = "*"
|
||||||
|
pandas = "*"
|
||||||
|
cachier = "*"
|
||||||
|
|
||||||
|
[dev-packages]
|
||||||
|
|
||||||
|
[requires]
|
||||||
|
python_version = "3.7"
|
237
Pipfile.lock
generated
Normal file
237
Pipfile.lock
generated
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
{
|
||||||
|
"_meta": {
|
||||||
|
"hash": {
|
||||||
|
"sha256": "645ddde7fd5f497ea131e2195b311a8f0818328bbb2514c82599f6c69bdf6cda"
|
||||||
|
},
|
||||||
|
"pipfile-spec": 6,
|
||||||
|
"requires": {
|
||||||
|
"python_version": "3.7"
|
||||||
|
},
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"name": "pypi",
|
||||||
|
"url": "https://pypi.org/simple",
|
||||||
|
"verify_ssl": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default": {
|
||||||
|
"argh": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:a9b3aaa1904eeb78e32394cd46c6f37ac0fb4af6dc488daa58971bdc7d7fcaf3",
|
||||||
|
"sha256:e9535b8c84dc9571a48999094fda7f33e63c3f1b74f3e5f3ac0105a58405bb65"
|
||||||
|
],
|
||||||
|
"version": "==0.26.2"
|
||||||
|
},
|
||||||
|
"atomicwrites": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4",
|
||||||
|
"sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6"
|
||||||
|
],
|
||||||
|
"version": "==1.3.0"
|
||||||
|
},
|
||||||
|
"attrs": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79",
|
||||||
|
"sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399"
|
||||||
|
],
|
||||||
|
"version": "==19.1.0"
|
||||||
|
},
|
||||||
|
"cachier": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:2d195f2f0767f5149533987aab5a7bb0f8c2264d88a4ef440dbf09628b2a9f4b"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==1.2.5"
|
||||||
|
},
|
||||||
|
"more-itertools": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:0125e8f60e9e031347105eb1682cef932f5e97d7b9a1a28d9bf00c22a5daef40",
|
||||||
|
"sha256:590044e3942351a1bdb1de960b739ff4ce277960f2425ad4509446dbace8d9d1"
|
||||||
|
],
|
||||||
|
"markers": "python_version > '2.7'",
|
||||||
|
"version": "==6.0.0"
|
||||||
|
},
|
||||||
|
"mpmath": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:fc17abe05fbab3382b61a123c398508183406fa132e0223874578e20946499f6"
|
||||||
|
],
|
||||||
|
"version": "==1.1.0"
|
||||||
|
},
|
||||||
|
"numpy": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:1980f8d84548d74921685f68096911585fee393975f53797614b34d4f409b6da",
|
||||||
|
"sha256:22752cd809272671b273bb86df0f505f505a12368a3a5fc0aa811c7ece4dfd5c",
|
||||||
|
"sha256:23cc40313036cffd5d1873ef3ce2e949bdee0646c5d6f375bf7ee4f368db2511",
|
||||||
|
"sha256:2b0b118ff547fecabc247a2668f48f48b3b1f7d63676ebc5be7352a5fd9e85a5",
|
||||||
|
"sha256:3a0bd1edf64f6a911427b608a894111f9fcdb25284f724016f34a84c9a3a6ea9",
|
||||||
|
"sha256:3f25f6c7b0d000017e5ac55977a3999b0b1a74491eacb3c1aa716f0e01f6dcd1",
|
||||||
|
"sha256:4061c79ac2230594a7419151028e808239450e676c39e58302ad296232e3c2e8",
|
||||||
|
"sha256:560ceaa24f971ab37dede7ba030fc5d8fa173305d94365f814d9523ffd5d5916",
|
||||||
|
"sha256:62be044cd58da2a947b7e7b2252a10b42920df9520fc3d39f5c4c70d5460b8ba",
|
||||||
|
"sha256:6c692e3879dde0b67a9dc78f9bfb6f61c666b4562fd8619632d7043fb5b691b0",
|
||||||
|
"sha256:6f65e37b5a331df950ef6ff03bd4136b3c0bbcf44d4b8e99135d68a537711b5a",
|
||||||
|
"sha256:7a78cc4ddb253a55971115f8320a7ce28fd23a065fc33166d601f51760eecfa9",
|
||||||
|
"sha256:80a41edf64a3626e729a62df7dd278474fc1726836552b67a8c6396fd7e86760",
|
||||||
|
"sha256:893f4d75255f25a7b8516feb5766c6b63c54780323b9bd4bc51cdd7efc943c73",
|
||||||
|
"sha256:972ea92f9c1b54cc1c1a3d8508e326c0114aaf0f34996772a30f3f52b73b942f",
|
||||||
|
"sha256:9f1d4865436f794accdabadc57a8395bd3faa755449b4f65b88b7df65ae05f89",
|
||||||
|
"sha256:9f4cd7832b35e736b739be03b55875706c8c3e5fe334a06210f1a61e5c2c8ca5",
|
||||||
|
"sha256:adab43bf657488300d3aeeb8030d7f024fcc86e3a9b8848741ea2ea903e56610",
|
||||||
|
"sha256:bd2834d496ba9b1bdda3a6cf3de4dc0d4a0e7be306335940402ec95132ad063d",
|
||||||
|
"sha256:d20c0360940f30003a23c0adae2fe50a0a04f3e48dc05c298493b51fd6280197",
|
||||||
|
"sha256:d3b3ed87061d2314ff3659bb73896e622252da52558f2380f12c421fbdee3d89",
|
||||||
|
"sha256:dc235bf29a406dfda5790d01b998a1c01d7d37f449128c0b1b7d1c89a84fae8b",
|
||||||
|
"sha256:fb3c83554f39f48f3fa3123b9c24aecf681b1c289f9334f8215c1d3c8e2f6e5b"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==1.16.2"
|
||||||
|
},
|
||||||
|
"pandas": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:071e42b89b57baa17031af8c6b6bbd2e9a5c68c595bc6bf9adabd7a9ed125d3b",
|
||||||
|
"sha256:17450e25ae69e2e6b303817bdf26b2cd57f69595d8550a77c308be0cd0fd58fa",
|
||||||
|
"sha256:17916d818592c9ec891cbef2e90f98cc85e0f1e89ed0924c9b5220dc3209c846",
|
||||||
|
"sha256:2538f099ab0e9f9c9d09bbcd94b47fd889bad06dc7ae96b1ed583f1dc1a7a822",
|
||||||
|
"sha256:366f30710172cb45a6b4f43b66c220653b1ea50303fbbd94e50571637ffb9167",
|
||||||
|
"sha256:42e5ad741a0d09232efbc7fc648226ed93306551772fc8aecc6dce9f0e676794",
|
||||||
|
"sha256:4e718e7f395ba5bfe8b6f6aaf2ff1c65a09bb77a36af6394621434e7cc813204",
|
||||||
|
"sha256:4f919f409c433577a501e023943e582c57355d50a724c589e78bc1d551a535a2",
|
||||||
|
"sha256:4fe0d7e6438212e839fc5010c78b822664f1a824c0d263fd858f44131d9166e2",
|
||||||
|
"sha256:5149a6db3e74f23dc3f5a216c2c9ae2e12920aa2d4a5b77e44e5b804a5f93248",
|
||||||
|
"sha256:627594338d6dd995cfc0bacd8e654cd9e1252d2a7c959449228df6740d737eb8",
|
||||||
|
"sha256:83c702615052f2a0a7fb1dd289726e29ec87a27272d775cb77affe749cca28f8",
|
||||||
|
"sha256:8c872f7fdf3018b7891e1e3e86c55b190e6c5cee70cab771e8f246c855001296",
|
||||||
|
"sha256:90f116086063934afd51e61a802a943826d2aac572b2f7d55caaac51c13db5b5",
|
||||||
|
"sha256:a3352bacac12e1fc646213b998bce586f965c9d431773d9e91db27c7c48a1f7d",
|
||||||
|
"sha256:bcdd06007cca02d51350f96debe51331dec429ac8f93930a43eb8fb5639e3eb5",
|
||||||
|
"sha256:c1bd07ebc15285535f61ddd8c0c75d0d6293e80e1ee6d9a8d73f3f36954342d0",
|
||||||
|
"sha256:c9a4b7c55115eb278c19aa14b34fcf5920c8fe7797a09b7b053ddd6195ea89b3",
|
||||||
|
"sha256:cc8fc0c7a8d5951dc738f1c1447f71c43734244453616f32b8aa0ef6013a5dfb",
|
||||||
|
"sha256:d7b460bc316064540ce0c41c1438c416a40746fd8a4fb2999668bf18f3c4acf1"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==0.24.2"
|
||||||
|
},
|
||||||
|
"pathtools": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:7c35c5421a39bb82e58018febd90e3b6e5db34c5443aaaf742b3f33d4655f1c0"
|
||||||
|
],
|
||||||
|
"version": "==0.1.2"
|
||||||
|
},
|
||||||
|
"pluggy": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:19ecf9ce9db2fce065a7a0586e07cfb4ac8614fe96edf628a264b1c70116cf8f",
|
||||||
|
"sha256:84d306a647cc805219916e62aab89caa97a33a1dd8c342e87a37f91073cd4746"
|
||||||
|
],
|
||||||
|
"version": "==0.9.0"
|
||||||
|
},
|
||||||
|
"portalocker": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:3fb35648a9e03f267e54c6186513abbd1cdd321c305502545a3550eea8b2923f",
|
||||||
|
"sha256:d98cdcdbd8c590ee4c93fb4149b2e76030ea6c36d6fdfec122e6656ebf90086f"
|
||||||
|
],
|
||||||
|
"version": "==1.4.0"
|
||||||
|
},
|
||||||
|
"py": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa",
|
||||||
|
"sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53"
|
||||||
|
],
|
||||||
|
"version": "==1.8.0"
|
||||||
|
},
|
||||||
|
"pytest": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:592eaa2c33fae68c7d75aacf042efc9f77b27c08a6224a4f59beab8d9a420523",
|
||||||
|
"sha256:ad3ad5c450284819ecde191a654c09b0ec72257a2c711b9633d677c71c9850c4"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==4.3.1"
|
||||||
|
},
|
||||||
|
"python-dateutil": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb",
|
||||||
|
"sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e"
|
||||||
|
],
|
||||||
|
"version": "==2.8.0"
|
||||||
|
},
|
||||||
|
"pytz": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9",
|
||||||
|
"sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c"
|
||||||
|
],
|
||||||
|
"version": "==2018.9"
|
||||||
|
},
|
||||||
|
"pyyaml": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:1adecc22f88d38052fb787d959f003811ca858b799590a5eaa70e63dca50308c",
|
||||||
|
"sha256:436bc774ecf7c103814098159fbb84c2715d25980175292c648f2da143909f95",
|
||||||
|
"sha256:460a5a4248763f6f37ea225d19d5c205677d8d525f6a83357ca622ed541830c2",
|
||||||
|
"sha256:5a22a9c84653debfbf198d02fe592c176ea548cccce47553f35f466e15cf2fd4",
|
||||||
|
"sha256:7a5d3f26b89d688db27822343dfa25c599627bc92093e788956372285c6298ad",
|
||||||
|
"sha256:9372b04a02080752d9e6f990179a4ab840227c6e2ce15b95e1278456664cf2ba",
|
||||||
|
"sha256:a5dcbebee834eaddf3fa7366316b880ff4062e4bcc9787b78c7fbb4a26ff2dd1",
|
||||||
|
"sha256:aee5bab92a176e7cd034e57f46e9df9a9862a71f8f37cad167c6fc74c65f5b4e",
|
||||||
|
"sha256:c51f642898c0bacd335fc119da60baae0824f2cde95b0330b56c0553439f0673",
|
||||||
|
"sha256:c68ea4d3ba1705da1e0d85da6684ac657912679a649e8868bd850d2c299cce13",
|
||||||
|
"sha256:e23d0cc5299223dcc37885dae624f382297717e459ea24053709675a976a3e19"
|
||||||
|
],
|
||||||
|
"version": "==5.1"
|
||||||
|
},
|
||||||
|
"scipy": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:014cb900c003b5ac81a53f2403294e8ecf37aedc315b59a6b9370dce0aa7627a",
|
||||||
|
"sha256:281a34da34a5e0de42d26aed692ab710141cad9d5d218b20643a9cb538ace976",
|
||||||
|
"sha256:588f9cc4bfab04c45fbd19c1354b5ade377a8124d6151d511c83730a9b6b2338",
|
||||||
|
"sha256:5a10661accd36b6e2e8855addcf3d675d6222006a15795420a39c040362def66",
|
||||||
|
"sha256:628f60be272512ca1123524969649a8cb5ae8b31cca349f7c6f8903daf9034d7",
|
||||||
|
"sha256:6dcc43a88e25b815c2dea1c6fac7339779fc988f5df8396e1de01610604a7c38",
|
||||||
|
"sha256:70e37cec0ac0fe95c85b74ca4e0620169590fd5d3f44765f3c3a532cedb0e5fd",
|
||||||
|
"sha256:7274735fb6fb5d67d3789ddec2cd53ed6362539b41aa6cc0d33a06c003aaa390",
|
||||||
|
"sha256:78e12972e144da47326958ac40c2bd1c1cca908edc8b01c26a36f9ffd3dce466",
|
||||||
|
"sha256:790cbd3c8d09f3a6d9c47c4558841e25bac34eb7a0864a9def8f26be0b8706af",
|
||||||
|
"sha256:79792c8fe8e9d06ebc50fe23266522c8c89f20aa94ac8e80472917ecdce1e5ba",
|
||||||
|
"sha256:865afedf35aaef6df6344bee0de391ee5e99d6e802950a237f9fb9b13e441f91",
|
||||||
|
"sha256:870fd401ec7b64a895cff8e206ee16569158db00254b2f7157b4c9a5db72c722",
|
||||||
|
"sha256:963815c226b29b0176d5e3d37fc9de46e2778ce4636a5a7af11a48122ef2577c",
|
||||||
|
"sha256:9726791484f08e394af0b59eb80489ad94d0a53bbb58ab1837dcad4d58489863",
|
||||||
|
"sha256:9de84a71bb7979aa8c089c4fb0ea0e2ed3917df3fb2a287a41aaea54bbad7f5d",
|
||||||
|
"sha256:b2c324ddc5d6dbd3f13680ad16a29425841876a84a1de23a984236d1afff4fa6",
|
||||||
|
"sha256:b86ae13c597fca087cb8c193870507c8916cefb21e52e1897da320b5a35075e5",
|
||||||
|
"sha256:ba0488d4dbba2af5bf9596b849873102d612e49a118c512d9d302ceafa36e01a",
|
||||||
|
"sha256:d78702af4102a3a4e23bb7372cec283e78f32f5573d92091aa6aaba870370fe1",
|
||||||
|
"sha256:def0e5d681dd3eb562b059d355ae8bebe27f5cc455ab7c2b6655586b63d3a8ea",
|
||||||
|
"sha256:e085d1babcb419bbe58e2e805ac61924dac4ca45a07c9fa081144739e500aa3c",
|
||||||
|
"sha256:e2cfcbab37c082a5087aba5ff00209999053260441caadd4f0e8f4c2d6b72088",
|
||||||
|
"sha256:e742f1f5dcaf222e8471c37ee3d1fd561568a16bb52e031c25674ff1cf9702d5",
|
||||||
|
"sha256:f06819b028b8ef9010281e74c59cb35483933583043091ed6b261bb1540f11cc",
|
||||||
|
"sha256:f15f2d60a11c306de7700ee9f65df7e9e463848dbea9c8051e293b704038da60",
|
||||||
|
"sha256:f31338ee269d201abe76083a990905473987371ff6f3fdb76a3f9073a361cf37",
|
||||||
|
"sha256:f6b88c8d302c3dac8dff7766955e38d670c82e0d79edfc7eae47d6bb2c186594"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==1.2.1"
|
||||||
|
},
|
||||||
|
"six": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c",
|
||||||
|
"sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"
|
||||||
|
],
|
||||||
|
"version": "==1.12.0"
|
||||||
|
},
|
||||||
|
"sympy": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:e1319b556207a3758a0efebae14e5e52c648fc1db8975953b05fff12b6871b54"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==1.3"
|
||||||
|
},
|
||||||
|
"watchdog": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:965f658d0732de3188211932aeb0bb457587f04f63ab4c1e33eab878e9de961d"
|
||||||
|
],
|
||||||
|
"version": "==0.9.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"develop": {}
|
||||||
|
}
|
113
pub2.ipynb
Normal file
113
pub2.ipynb
Normal file
File diff suppressed because one or more lines are too long
BIN
roots128.pickle
Normal file
BIN
roots128.pickle
Normal file
Binary file not shown.
0
src/__init__.py
Normal file
0
src/__init__.py
Normal file
5
src/consts.py
Normal file
5
src/consts.py
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
l = 20
|
||||||
|
T = 100
|
||||||
|
|
||||||
|
D = 0.6
|
||||||
|
H = 4
|
0
src/runnables/__init__.py
Normal file
0
src/runnables/__init__.py
Normal file
86
src/runnables/compare.py
Normal file
86
src/runnables/compare.py
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
import itertools
|
||||||
|
|
||||||
|
import util
|
||||||
|
from solvers import solvers, solve_explicit, solve_implicit, solve_implicit_improved, solve_crank_nicolson, \
|
||||||
|
solve_crank_nicolson_improved
|
||||||
|
from solvers.theoretical import solve_theoretical
|
||||||
|
from util import Grid
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
def test_order(errors, next_params):
|
||||||
|
errors = dict(errors)
|
||||||
|
for params in list(errors.keys()):
|
||||||
|
if params not in errors:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# chain start
|
||||||
|
param_chain = []
|
||||||
|
error_chain = []
|
||||||
|
|
||||||
|
while params in errors:
|
||||||
|
param_chain.append(params)
|
||||||
|
error_chain.append(errors[params])
|
||||||
|
|
||||||
|
del errors[params]
|
||||||
|
|
||||||
|
params = next_params(params)
|
||||||
|
|
||||||
|
if len(param_chain) < 2:
|
||||||
|
continue
|
||||||
|
|
||||||
|
print(' ', ' -> '.join(map(str, param_chain)))
|
||||||
|
e = np.array(error_chain, dtype=float)
|
||||||
|
ed = e[:-1] / e[1:]
|
||||||
|
print(' ', ' '.join([f'{i:6.2f}' for i in ed]))
|
||||||
|
|
||||||
|
|
||||||
|
def test_solver(solver, Is, Ks):
|
||||||
|
param_pairs = itertools.product(Is, Ks)
|
||||||
|
param_pairs = sorted(param_pairs, key=np.prod)
|
||||||
|
|
||||||
|
errors_mse = {}
|
||||||
|
errors_mae = {}
|
||||||
|
errors_mae_last = {}
|
||||||
|
|
||||||
|
for I, K in param_pairs:
|
||||||
|
grid = Grid(I, K)
|
||||||
|
|
||||||
|
solution = solver(grid)
|
||||||
|
if solution is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
reference = solve_theoretical(grid)
|
||||||
|
|
||||||
|
errors_mse[(I, K)] = util.mse(reference, solution)
|
||||||
|
errors_mae[(I, K)] = util.mae(reference, solution)
|
||||||
|
errors_mae_last[(I, K)] = util.mae_last(reference, solution)
|
||||||
|
|
||||||
|
print()
|
||||||
|
print()
|
||||||
|
print(solver.__name__)
|
||||||
|
|
||||||
|
print('O(h_x, h_t) MAEL SHOULD BE >=2')
|
||||||
|
test_order(errors_mae_last, next_params=lambda params: (params[0] * 2, params[1] * 2))
|
||||||
|
|
||||||
|
print(f'O(h_x, h_t^2) MAEL SHOULD BE >=4')
|
||||||
|
test_order(errors_mae_last, next_params=lambda params: (params[0] * 4, params[1] * 2))
|
||||||
|
|
||||||
|
print(f'O(h_x^2, h_t) MAEL SHOULD BE >=4')
|
||||||
|
test_order(errors_mae_last, next_params=lambda params: (params[0] * 2, params[1] * 4))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# Is = [4, 8, 16, 32, 64, 128, 256, 512]
|
||||||
|
# Ks = [4, 8, 16, 32, 64, 128, 256, 512]
|
||||||
|
# Is = [4, 8, 16, 32, 64, 128, 256, 512]
|
||||||
|
# Ks = [32, 64, 128, 256, 512, 1024, 2048, 4096]
|
||||||
|
Is = [4, 8, 16, 32, 64]
|
||||||
|
Ks = [32, 64, 128, 256, 512, 1024]
|
||||||
|
|
||||||
|
test_solver(solve_explicit, Is, Ks)
|
||||||
|
test_solver(solve_implicit, Is, Ks)
|
||||||
|
test_solver(solve_implicit_improved, Is, Ks)
|
||||||
|
test_solver(solve_crank_nicolson, Is, Ks)
|
||||||
|
test_solver(solve_crank_nicolson_improved, Is, Ks)
|
20
src/runnables/run_all.py
Normal file
20
src/runnables/run_all.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import util
|
||||||
|
from solvers import solvers
|
||||||
|
from solvers.theoretical import solve_theoretical
|
||||||
|
from util import Grid
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
grid = Grid(16, 128)
|
||||||
|
|
||||||
|
reference = solve_theoretical(grid)
|
||||||
|
|
||||||
|
print()
|
||||||
|
print(grid)
|
||||||
|
|
||||||
|
for solver in solvers:
|
||||||
|
solution = solver(grid)
|
||||||
|
|
||||||
|
mse = util.mse(reference, solution)
|
||||||
|
mae = util.mae(reference, solution)
|
||||||
|
|
||||||
|
print(f'{solver.__name__:30} {mse:.4e} {mae:.4e}')
|
27
src/runnables/where_mae.py
Normal file
27
src/runnables/where_mae.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
from solvers import solvers, solve_theoretical
|
||||||
|
from util import Grid
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
I = 16
|
||||||
|
K = 512
|
||||||
|
|
||||||
|
grid = Grid(I, K)
|
||||||
|
|
||||||
|
for solver in solvers:
|
||||||
|
solution = solver(grid)
|
||||||
|
if solution is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
print(solver.__name__)
|
||||||
|
|
||||||
|
reference = solve_theoretical(grid)
|
||||||
|
|
||||||
|
e = np.abs(reference - solution)
|
||||||
|
|
||||||
|
flat_indices = np.argsort(e, axis=None)
|
||||||
|
|
||||||
|
for index in flat_indices[-10:]:
|
||||||
|
i, j = np.unravel_index(index, e.shape)
|
||||||
|
print(f'{i:4} {j:4} {e[i, j]}')
|
12
src/solvers/__init__.py
Normal file
12
src/solvers/__init__.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
from solvers.crank_nicolson import solve_crank_nicolson, solve_crank_nicolson_improved
|
||||||
|
from solvers.explicit import solve_explicit
|
||||||
|
from solvers.implicit import solve_implicit, solve_implicit_improved
|
||||||
|
from solvers.theoretical import solve_theoretical
|
||||||
|
|
||||||
|
solvers = [
|
||||||
|
solve_explicit,
|
||||||
|
solve_implicit,
|
||||||
|
solve_implicit_improved,
|
||||||
|
solve_crank_nicolson,
|
||||||
|
solve_crank_nicolson_improved,
|
||||||
|
]
|
102
src/solvers/crank_nicolson.py
Normal file
102
src/solvers/crank_nicolson.py
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
import numpy as np
|
||||||
|
import scipy.sparse
|
||||||
|
import scipy.sparse.linalg
|
||||||
|
|
||||||
|
import consts
|
||||||
|
from util import Grid
|
||||||
|
|
||||||
|
|
||||||
|
#@cachier(stale_after=datetime.timedelta(hours=1))
|
||||||
|
def solve_crank_nicolson(grid: Grid) -> np.ndarray:
|
||||||
|
ug = np.zeros((grid.K + 1, grid.I + 1), dtype=float)
|
||||||
|
|
||||||
|
ug[0, :] = np.sin(np.pi * grid.xs / consts.l) ** 2 * 4 / 10
|
||||||
|
|
||||||
|
for k in range(1, grid.K + 1):
|
||||||
|
diags = {
|
||||||
|
-1: np.zeros(grid.I + 1, dtype=float),
|
||||||
|
0: np.zeros(grid.I + 1, dtype=float),
|
||||||
|
+1: np.zeros(grid.I + 1, dtype=float),
|
||||||
|
}
|
||||||
|
b = np.zeros(grid.I + 1, dtype=float)
|
||||||
|
|
||||||
|
# left
|
||||||
|
diags[0][0] = consts.H * grid.h_x + 1
|
||||||
|
diags[+1][0] = -1
|
||||||
|
|
||||||
|
# middle
|
||||||
|
for i in range(1, grid.I):
|
||||||
|
diags[-1][i] = grid.gamma
|
||||||
|
diags[0][i] = - 2 * grid.gamma - 2
|
||||||
|
diags[+1][i] = grid.gamma
|
||||||
|
b[i] = -(
|
||||||
|
ug[k - 1][i - 1] * grid.gamma +
|
||||||
|
ug[k - 1][i] * (-2 * grid.gamma + 2) +
|
||||||
|
ug[k - 1][i + 1] * grid.gamma
|
||||||
|
)
|
||||||
|
|
||||||
|
# right
|
||||||
|
diags[0][grid.I] = consts.H * grid.h_x + 1
|
||||||
|
diags[-1][grid.I] = -1
|
||||||
|
|
||||||
|
A = scipy.sparse.diags([
|
||||||
|
diags[-1][1:],
|
||||||
|
diags[0],
|
||||||
|
diags[+1][:-1],
|
||||||
|
], [-1, 0, 1], format='csc')
|
||||||
|
|
||||||
|
ug[k, :] = scipy.sparse.linalg.spsolve(A, b)
|
||||||
|
|
||||||
|
return ug
|
||||||
|
|
||||||
|
|
||||||
|
#@cachier(stale_after=datetime.timedelta(hours=1))
|
||||||
|
def solve_crank_nicolson_improved(grid: Grid) -> np.ndarray:
|
||||||
|
ug = np.zeros((grid.K + 1, grid.I + 1), dtype=float)
|
||||||
|
|
||||||
|
ug[0, :] = np.sin(np.pi * grid.xs / consts.l) ** 2 * 4 / 10
|
||||||
|
|
||||||
|
for k in range(1, grid.K + 1):
|
||||||
|
diags = {
|
||||||
|
-1: np.zeros(grid.I + 1, dtype=float),
|
||||||
|
0: np.zeros(grid.I + 1, dtype=float),
|
||||||
|
+1: np.zeros(grid.I + 1, dtype=float),
|
||||||
|
}
|
||||||
|
b = np.zeros(grid.I + 1, dtype=float)
|
||||||
|
|
||||||
|
# left
|
||||||
|
diags[0][0] = consts.H * grid.gamma * grid.h_x + grid.gamma + 1
|
||||||
|
diags[+1][0] = - grid.gamma
|
||||||
|
b[0] = (
|
||||||
|
(- consts.H * grid.gamma * grid.h_x - grid.gamma + 1) * ug[k - 1, 0] +
|
||||||
|
grid.gamma * ug[k - 1, 1]
|
||||||
|
)
|
||||||
|
|
||||||
|
# middle
|
||||||
|
for i in range(1, grid.I):
|
||||||
|
diags[-1][i] = grid.gamma
|
||||||
|
diags[0][i] = - 2 * grid.gamma - 2
|
||||||
|
diags[+1][i] = grid.gamma
|
||||||
|
b[i] = -(
|
||||||
|
ug[k - 1][i - 1] * grid.gamma +
|
||||||
|
ug[k - 1][i] * (-2 * grid.gamma + 2) +
|
||||||
|
ug[k - 1][i + 1] * grid.gamma
|
||||||
|
)
|
||||||
|
|
||||||
|
# right
|
||||||
|
diags[0][grid.I] = consts.H * grid.gamma * grid.h_x + grid.gamma + 1
|
||||||
|
diags[-1][grid.I] = - grid.gamma
|
||||||
|
b[grid.I] = (
|
||||||
|
(- consts.H * grid.gamma * grid.h_x - grid.gamma + 1) * ug[k - 1, grid.I] +
|
||||||
|
grid.gamma * ug[k - 1, grid.I - 1]
|
||||||
|
)
|
||||||
|
|
||||||
|
A = scipy.sparse.diags([
|
||||||
|
diags[-1][1:],
|
||||||
|
diags[0],
|
||||||
|
diags[+1][:-1],
|
||||||
|
], [-1, 0, 1], format='csc')
|
||||||
|
|
||||||
|
ug[k, :] = scipy.sparse.linalg.spsolve(A, b)
|
||||||
|
|
||||||
|
return ug
|
32
src/solvers/explicit.py
Normal file
32
src/solvers/explicit.py
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
import consts
|
||||||
|
from util import Grid
|
||||||
|
|
||||||
|
|
||||||
|
#@cachier(stale_after=datetime.timedelta(hours=1))
|
||||||
|
def solve_explicit(grid: Grid) -> Optional[np.ndarray]:
|
||||||
|
if grid.gamma > 1 / 2:
|
||||||
|
return None
|
||||||
|
|
||||||
|
ug = np.zeros((grid.K + 1, grid.I + 1), dtype=float)
|
||||||
|
|
||||||
|
ug[0, :] = np.sin(np.pi * grid.xs / consts.l) ** 2 * 4 / 10
|
||||||
|
|
||||||
|
for k in range(1, grid.K + 1):
|
||||||
|
# middle
|
||||||
|
ug[k, 1: grid.I] = (
|
||||||
|
grid.gamma * ug[k - 1, 0: grid.I - 1] +
|
||||||
|
(-2 * grid.gamma + 1) * ug[k - 1, 1: grid.I] +
|
||||||
|
grid.gamma * ug[k - 1, 2: grid.I + 1]
|
||||||
|
)
|
||||||
|
|
||||||
|
# left
|
||||||
|
ug[k, 0] = ug[k, 1] / (consts.H * grid.h_x + 1)
|
||||||
|
|
||||||
|
# right
|
||||||
|
ug[k, grid.I] = ug[k, grid.I - 1] / (consts.H * grid.h_x + 1)
|
||||||
|
|
||||||
|
return ug
|
95
src/solvers/implicit.py
Normal file
95
src/solvers/implicit.py
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
import numpy as np
|
||||||
|
import scipy.sparse
|
||||||
|
import scipy.sparse.linalg
|
||||||
|
|
||||||
|
import consts
|
||||||
|
|
||||||
|
|
||||||
|
#@cachier(stale_after=datetime.timedelta(hours=1))
|
||||||
|
def solve_implicit(grid) -> np.ndarray:
|
||||||
|
ug = np.zeros((grid.K + 1, grid.I + 1), dtype=float)
|
||||||
|
|
||||||
|
ug[0, :] = np.sin(np.pi * grid.xs / consts.l) ** 2 * 4 / 10
|
||||||
|
|
||||||
|
for k in range(1, grid.K + 1):
|
||||||
|
diags = {
|
||||||
|
-1: np.zeros(grid.I + 1, dtype=float),
|
||||||
|
0: np.zeros(grid.I + 1, dtype=float),
|
||||||
|
+1: np.zeros(grid.I + 1, dtype=float),
|
||||||
|
}
|
||||||
|
b = np.zeros(grid.I + 1, dtype=float)
|
||||||
|
|
||||||
|
# left
|
||||||
|
diags[0][0] = consts.H * grid.h_x + 1
|
||||||
|
diags[+1][0] = -1
|
||||||
|
|
||||||
|
# middle
|
||||||
|
for i in range(1, grid.I):
|
||||||
|
diags[-1][i] = grid.gamma
|
||||||
|
diags[0][i] = - 2 * grid.gamma - 1
|
||||||
|
diags[+1][i] = grid.gamma
|
||||||
|
b[i] = -ug[k - 1, i]
|
||||||
|
|
||||||
|
# right
|
||||||
|
diags[-1][grid.I] = -1
|
||||||
|
diags[0][grid.I] = consts.H * grid.h_x + 1
|
||||||
|
|
||||||
|
A = scipy.sparse.diags([
|
||||||
|
diags[-1][1:],
|
||||||
|
diags[0],
|
||||||
|
diags[+1][:-1],
|
||||||
|
], [-1, 0, 1], format='csc')
|
||||||
|
|
||||||
|
ug[k, :] = scipy.sparse.linalg.spsolve(A, b)
|
||||||
|
|
||||||
|
return ug
|
||||||
|
|
||||||
|
|
||||||
|
#@cachier(stale_after=datetime.timedelta(hours=1))
|
||||||
|
def solve_implicit_improved(grid) -> np.ndarray:
|
||||||
|
ug = np.zeros((grid.K + 1, grid.I + 1), dtype=float)
|
||||||
|
|
||||||
|
ug[0, :] = np.sin(np.pi * grid.xs / consts.l) ** 2 * 4 / 10
|
||||||
|
|
||||||
|
for k in range(1, grid.K + 1):
|
||||||
|
diags = {
|
||||||
|
-1: np.zeros(grid.I + 1, dtype=float),
|
||||||
|
0: np.zeros(grid.I + 1, dtype=float),
|
||||||
|
+1: np.zeros(grid.I + 1, dtype=float),
|
||||||
|
}
|
||||||
|
b = np.zeros(grid.I + 1, dtype=float)
|
||||||
|
|
||||||
|
# left
|
||||||
|
diags[0][0] = (
|
||||||
|
2 * consts.H * grid.gamma * grid.h_x +
|
||||||
|
2 * grid.gamma +
|
||||||
|
1
|
||||||
|
)
|
||||||
|
diags[+1][0] = - 2 * grid.gamma
|
||||||
|
b[0] = ug[k - 1, 0]
|
||||||
|
|
||||||
|
# middle
|
||||||
|
for i in range(1, grid.I):
|
||||||
|
diags[-1][i] = grid.gamma
|
||||||
|
diags[0][i] = - 2 * grid.gamma - 1
|
||||||
|
diags[+1][i] = grid.gamma
|
||||||
|
b[i] = -ug[k - 1, i]
|
||||||
|
|
||||||
|
# right
|
||||||
|
diags[0][grid.I] = (
|
||||||
|
2 * consts.H * grid.gamma * grid.h_x +
|
||||||
|
2 * grid.gamma +
|
||||||
|
1
|
||||||
|
)
|
||||||
|
diags[-1][grid.I] = - 2 * grid.gamma
|
||||||
|
b[grid.I] = ug[k - 1, grid.I]
|
||||||
|
|
||||||
|
A = scipy.sparse.diags([
|
||||||
|
diags[-1][1:],
|
||||||
|
diags[0],
|
||||||
|
diags[+1][:-1],
|
||||||
|
], [-1, 0, 1], format='csc')
|
||||||
|
|
||||||
|
ug[k, :] = scipy.sparse.linalg.spsolve(A, b)
|
||||||
|
|
||||||
|
return ug
|
35
src/solvers/theoretical.py
Normal file
35
src/solvers/theoretical.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import functools
|
||||||
|
import pickle
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
from util import Grid
|
||||||
|
|
||||||
|
with open('./roots128.pickle', 'rb') as file:
|
||||||
|
roots128 = pickle.load(file)
|
||||||
|
|
||||||
|
|
||||||
|
def u_elem128(x, t, alpha_n):
|
||||||
|
x = np.float128(x)
|
||||||
|
t = np.float128(t)
|
||||||
|
alpha_n = np.float128(alpha_n)
|
||||||
|
return -4 * np.pi ** 2 * (alpha_n * np.cos(alpha_n * x / 10) + 40 * np.sin(alpha_n * x / 10)) * (
|
||||||
|
alpha_n * np.sin(2 * alpha_n) - 40 * np.cos(2 * alpha_n) + 40) * np.exp(-3 * alpha_n ** 2 * t / 500) / (
|
||||||
|
5 * (alpha_n ** 2 - np.pi ** 2) * (alpha_n ** 2 * (4 * alpha_n + np.sin(4 * alpha_n)) - 80 * alpha_n * (
|
||||||
|
np.cos(4 * alpha_n) - 1) + 6400 * alpha_n - 1600 * np.sin(4 * alpha_n)))
|
||||||
|
|
||||||
|
|
||||||
|
@functools.lru_cache(maxsize=1000000)
|
||||||
|
def u128(x, t, root_n=len(roots128)):
|
||||||
|
return sum(u_elem128(x, t, roots128[:root_n]))
|
||||||
|
|
||||||
|
|
||||||
|
#@cachier(stale_after=datetime.timedelta(hours=1))
|
||||||
|
def solve_theoretical(grid: Grid) -> np.ndarray:
|
||||||
|
ug = np.zeros((grid.K + 1, grid.I + 1), dtype=float)
|
||||||
|
|
||||||
|
for k, t in enumerate(grid.ts):
|
||||||
|
for i, x in enumerate(grid.xs):
|
||||||
|
ug[k, i] = u128(x, t, 1000)
|
||||||
|
|
||||||
|
return ug
|
45
src/util.py
Normal file
45
src/util.py
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
from dataclasses import dataclass, field
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
import consts
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Grid:
|
||||||
|
I: int
|
||||||
|
K: int
|
||||||
|
|
||||||
|
xs: np.ndarray = field(repr=False, compare=False)
|
||||||
|
ts: np.ndarray = field(repr=False, compare=False)
|
||||||
|
|
||||||
|
h_x: float = field(repr=False, compare=False)
|
||||||
|
h_t: float = field(repr=False, compare=False)
|
||||||
|
|
||||||
|
gamma: float = field(repr=False, compare=False)
|
||||||
|
|
||||||
|
def __init__(self, I: int, K: int):
|
||||||
|
self.I = I
|
||||||
|
self.K = K
|
||||||
|
|
||||||
|
self.xs = np.linspace(0, consts.l, I + 1)
|
||||||
|
self.ts = np.linspace(0, consts.T, K + 1)
|
||||||
|
|
||||||
|
self.h_x = consts.l / I
|
||||||
|
self.h_t = consts.T / K
|
||||||
|
|
||||||
|
self.gamma = consts.D * self.h_t / (self.h_x ** 2)
|
||||||
|
|
||||||
|
def __hash__(self):
|
||||||
|
return hash((self.I, self.K))
|
||||||
|
|
||||||
|
|
||||||
|
def mse(ug1: np.ndarray, ug2: np.ndarray) -> float:
|
||||||
|
return np.mean((ug1 - ug2) ** 2)
|
||||||
|
|
||||||
|
|
||||||
|
def mae(ug1: np.ndarray, ug2: np.ndarray) -> float:
|
||||||
|
return np.max(np.abs(ug1 - ug2))
|
||||||
|
|
||||||
|
|
||||||
|
def mae_last(ug1: np.ndarray, ug2: np.ndarray) -> float:
|
||||||
|
return np.max(np.abs(ug1[-1, :] - ug2[-1, :]))
|
945
symbolic.ipynb
Normal file
945
symbolic.ipynb
Normal file
File diff suppressed because one or more lines are too long
0
test/__init__.py
Normal file
0
test/__init__.py
Normal file
31
test/test_solvers.py
Normal file
31
test/test_solvers.py
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import util
|
||||||
|
from solvers.crank_nicolson import solve_crank_nicolson, solve_crank_nicolson_improved
|
||||||
|
from solvers.explicit import solve_explicit
|
||||||
|
from solvers.implicit import solve_implicit, solve_implicit_improved
|
||||||
|
from solvers.theoretical import solve_theoretical
|
||||||
|
from util import Grid
|
||||||
|
|
||||||
|
solvers = [
|
||||||
|
solve_explicit,
|
||||||
|
solve_implicit,
|
||||||
|
solve_implicit_improved,
|
||||||
|
solve_crank_nicolson,
|
||||||
|
solve_crank_nicolson_improved,
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_all():
|
||||||
|
grid = Grid(16, 128)
|
||||||
|
|
||||||
|
reference = solve_theoretical(grid)
|
||||||
|
|
||||||
|
print()
|
||||||
|
print(grid)
|
||||||
|
|
||||||
|
for solver in solvers:
|
||||||
|
solution = solver(grid)
|
||||||
|
|
||||||
|
mse = util.mse(reference, solution)
|
||||||
|
mae = util.mae(reference, solution)
|
||||||
|
|
||||||
|
print(f'{solver.__name__:30} {mse:.4e} {mae:.4e}')
|
BIN
Катков.docx
Normal file
BIN
Катков.docx
Normal file
Binary file not shown.
BIN
Катков.pdf
Normal file
BIN
Катков.pdf
Normal file
Binary file not shown.
BIN
Лысый.docx
Normal file
BIN
Лысый.docx
Normal file
Binary file not shown.
BIN
Методич. указания к к.р. по УМФ.2017 (1).doc
Normal file
BIN
Методич. указания к к.р. по УМФ.2017 (1).doc
Normal file
Binary file not shown.
BIN
Методич. указания к к.р. по УМФ.2017 (1).pdf
Normal file
BIN
Методич. указания к к.р. по УМФ.2017 (1).pdf
Normal file
Binary file not shown.
BIN
Нелысый.docx
Normal file
BIN
Нелысый.docx
Normal file
Binary file not shown.
BIN
Отчет_ЧММФ_Анурин_Гринина_Попов.docx
Normal file
BIN
Отчет_ЧММФ_Анурин_Гринина_Попов.docx
Normal file
Binary file not shown.
BIN
Отчет_ЧММФ_Анурин_Гринина_Попов.pdf
Normal file
BIN
Отчет_ЧММФ_Анурин_Гринина_Попов.pdf
Normal file
Binary file not shown.
906
разностные схемы 2.ipynb
Normal file
906
разностные схемы 2.ipynb
Normal file
@@ -0,0 +1,906 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 1,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"Populating the interactive namespace from numpy and matplotlib\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"%pylab inline"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 112,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"import pandas\n",
|
||||||
|
"import sympy as Ω\n",
|
||||||
|
"import matplotlib.pyplot as plt\n",
|
||||||
|
"import math\n",
|
||||||
|
"import pylab as p\n",
|
||||||
|
"import numpy as np\n",
|
||||||
|
"import decimal as d\n",
|
||||||
|
"from scipy.misc import derivative\n",
|
||||||
|
"import pickle\n",
|
||||||
|
"from tqdm import tqdm_notebook as tqdm\n",
|
||||||
|
"\n",
|
||||||
|
"from dataclasses import dataclass\n",
|
||||||
|
"\n",
|
||||||
|
"import scipy.sparse\n",
|
||||||
|
"import scipy.sparse.linalg\n",
|
||||||
|
"\n",
|
||||||
|
"import functools"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 3,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"Ω.init_printing()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 4,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"l_float = 20\n",
|
||||||
|
"T_float = 100\n",
|
||||||
|
"\n",
|
||||||
|
"D_float = 0.6\n",
|
||||||
|
"H_float = 4"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 113,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"with open('/Users/abra/projects/study/7semestr/degtyarev/roots128.pickle', 'rb') as file:\n",
|
||||||
|
" roots128 = pickle.load(file)\n",
|
||||||
|
"\n",
|
||||||
|
"roots = roots128\n",
|
||||||
|
"\n",
|
||||||
|
"def u_elem128(x, t, alpha_n):\n",
|
||||||
|
" x = np.float128(x)\n",
|
||||||
|
" t = np.float128(t)\n",
|
||||||
|
" alpha_n = np.float128(alpha_n)\n",
|
||||||
|
" return -4*np.pi**2*(alpha_n*np.cos(alpha_n*x/10) + 40*np.sin(alpha_n*x/10))*(alpha_n*np.sin(2*alpha_n) - 40*np.cos(2*alpha_n) + 40)*np.exp(-3*alpha_n**2*t/500)/(5*(alpha_n**2 - np.pi**2)*(alpha_n**2*(4*alpha_n + np.sin(4*alpha_n)) - 80*alpha_n*(np.cos(4*alpha_n) - 1) + 6400*alpha_n - 1600*np.sin(4*alpha_n)))\n",
|
||||||
|
"\n",
|
||||||
|
"@functools.lru_cache(maxsize=100000)\n",
|
||||||
|
"def u128(x, t, root_n=len(roots)):\n",
|
||||||
|
" return sum(u_elem128(x, t, roots[:root_n]))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 6,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"@dataclass\n",
|
||||||
|
"class Grid:\n",
|
||||||
|
" I: int\n",
|
||||||
|
" K: int\n",
|
||||||
|
" \n",
|
||||||
|
" xs: ndarray\n",
|
||||||
|
" ts: ndarray\n",
|
||||||
|
" \n",
|
||||||
|
" h_x: float\n",
|
||||||
|
" h_t: float\n",
|
||||||
|
" \n",
|
||||||
|
" def __init__(self, I, K):\n",
|
||||||
|
" self.I = I\n",
|
||||||
|
" self.K = K\n",
|
||||||
|
"\n",
|
||||||
|
" self.xs = linspace(0, l_float, I + 1)\n",
|
||||||
|
" self.ts = linspace(0, T_float, K + 1)\n",
|
||||||
|
"\n",
|
||||||
|
" self.h_x = l_float / I\n",
|
||||||
|
" self.h_t = T_float / K\n",
|
||||||
|
" \n",
|
||||||
|
" self.gamma = D_float * self.h_t / (self.h_x ** 2)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 7,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def ug_mse(ug1, ug2):\n",
|
||||||
|
" return np.mean((ug1 - ug2) ** 2)\n",
|
||||||
|
"\n",
|
||||||
|
"def ug_mae(ug1, ug2):\n",
|
||||||
|
" return np.max(np.abs(ug1 - ug2))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 64,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"n = 5000\n",
|
||||||
|
"\n",
|
||||||
|
"np.random.seed(0)\n",
|
||||||
|
"\n",
|
||||||
|
"a = np.random.uniform(0, 0.1, size=n-1)\n",
|
||||||
|
"b = np.ones(n)\n",
|
||||||
|
"c = np.random.uniform(0, 0.1, size=n-1)\n",
|
||||||
|
"\n",
|
||||||
|
"z = np.random.uniform(0, 0.1, size=n)\n",
|
||||||
|
"\n",
|
||||||
|
"A = np.zeros((n, n))\n",
|
||||||
|
"\n",
|
||||||
|
"for i in range(n):\n",
|
||||||
|
" A[i, i] = b[i]\n",
|
||||||
|
" \n",
|
||||||
|
" if i > 0:\n",
|
||||||
|
" A[i, i - 1] = a[i - 1]\n",
|
||||||
|
" \n",
|
||||||
|
" if i < n - 1:\n",
|
||||||
|
" A[i, i + 1] = c[i]"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 65,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"1.52 s ± 78.3 ms per loop (mean ± std. dev. of 5 runs, 5 loops each)\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"%%timeit -n 5 -r 5\n",
|
||||||
|
"np.linalg.solve(A, z)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 66,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"A_sp = scipy.sparse.diags([a, b, c], [-1, 0, 1], format='csc')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 67,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"3.1 ms ± 430 µs per loop (mean ± std. dev. of 5 runs, 5 loops each)\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"%%timeit -n 5 -r 5\n",
|
||||||
|
"scipy.sparse.linalg.spsolve(A_sp, z)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## теория"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 8,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def calc_theoretical(grid):\n",
|
||||||
|
" ug = zeros((grid.K + 1, grid.I + 1), dtype=float)\n",
|
||||||
|
" \n",
|
||||||
|
" for k, t in enumerate(grid.ts):\n",
|
||||||
|
" for i, x in enumerate(grid.xs):\n",
|
||||||
|
" ug[k, i] = u128(x, t, 100)\n",
|
||||||
|
" \n",
|
||||||
|
" return ug"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 9,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"58.89331758385291\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"grid = Grid(10, 50)\n",
|
||||||
|
"print(sum(calc_theoretical(grid)))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## простейшая явная схема"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 10,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def calc_explicit(grid):\n",
|
||||||
|
" if grid.gamma > 1/2:\n",
|
||||||
|
" raise Exception('Bad gamma!')\n",
|
||||||
|
" \n",
|
||||||
|
" ug = zeros((grid.K + 1, grid.I + 1), dtype=float)\n",
|
||||||
|
"\n",
|
||||||
|
" ug[0, :] = sin(np.pi * grid.xs / l_float) ** 2 * 4 / 10\n",
|
||||||
|
"\n",
|
||||||
|
" for k in range(1, grid.K + 1):\n",
|
||||||
|
" # middle\n",
|
||||||
|
" ug[k, 1 : grid.I] = (\n",
|
||||||
|
" grid.gamma * ug[k - 1, 0 : grid.I - 1] +\n",
|
||||||
|
" (-2 * grid.gamma + 1) * ug[k - 1, 1 : grid.I] + \n",
|
||||||
|
" grid.gamma * ug[k - 1, 2 : grid.I + 1]\n",
|
||||||
|
" )\n",
|
||||||
|
"\n",
|
||||||
|
" # left\n",
|
||||||
|
" ug[k, 0] = ug[k, 1] / (H_float * grid.h_x + 1)\n",
|
||||||
|
"\n",
|
||||||
|
" # right\n",
|
||||||
|
" ug[k, grid.I] = ug[k, grid.I - 1] / (H_float * grid.h_x + 1)\n",
|
||||||
|
" \n",
|
||||||
|
" return ug"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 11,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"58.72948448630509\n",
|
||||||
|
"4.3733803061715146e-07\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"grid = Grid(10, 50)\n",
|
||||||
|
"ug = calc_explicit(grid)\n",
|
||||||
|
"print(sum(ug))\n",
|
||||||
|
"print(ug_mse(ug, calc_theoretical(grid)))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## простейшая неявная схема"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 76,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def calc_implicit(grid):\n",
|
||||||
|
" ug = zeros((grid.K + 1, grid.I + 1), dtype=float)\n",
|
||||||
|
"\n",
|
||||||
|
" ug[0, :] = sin(np.pi * grid.xs / l_float) ** 2 * 4 / 10\n",
|
||||||
|
"\n",
|
||||||
|
" for k in range(1, grid.K + 1):\n",
|
||||||
|
" diags = {\n",
|
||||||
|
" -1: np.zeros(grid.I + 1, dtype=float),\n",
|
||||||
|
" 0: np.zeros(grid.I + 1, dtype=float),\n",
|
||||||
|
" +1: np.zeros(grid.I + 1, dtype=float),\n",
|
||||||
|
" }\n",
|
||||||
|
" b = np.zeros(grid.I + 1, dtype=float)\n",
|
||||||
|
"\n",
|
||||||
|
" # left\n",
|
||||||
|
" diags[ 0][0] = H_float + 1 / grid.h_x\n",
|
||||||
|
" diags[+1][0] = -1 / grid.h_x\n",
|
||||||
|
"\n",
|
||||||
|
" # middle\n",
|
||||||
|
" for i in range(1, grid.I):\n",
|
||||||
|
" diags[-1][i] = grid.gamma\n",
|
||||||
|
" diags[ 0][i] = - 2 * grid.gamma - 1\n",
|
||||||
|
" diags[+1][i] = grid.gamma\n",
|
||||||
|
" b[i] = -ug[k - 1, i]\n",
|
||||||
|
"\n",
|
||||||
|
" # right\n",
|
||||||
|
" diags[ 0][grid.I] = H_float + 1 / grid.h_x\n",
|
||||||
|
" diags[-1][grid.I] = -1 / grid.h_x\n",
|
||||||
|
"\n",
|
||||||
|
" A = scipy.sparse.diags([\n",
|
||||||
|
" diags[-1][1:], \n",
|
||||||
|
" diags[ 0], \n",
|
||||||
|
" diags[+1][:-1],\n",
|
||||||
|
" ], [-1, 0, 1], format='csc')\n",
|
||||||
|
" \n",
|
||||||
|
" ug[k, :] = scipy.sparse.linalg.spsolve(A, b)\n",
|
||||||
|
" \n",
|
||||||
|
" return ug"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 69,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"59.49556361037571\n",
|
||||||
|
"4.006492537092588e-06\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"grid = Grid(10, 50)\n",
|
||||||
|
"ug = calc_implicit(grid)\n",
|
||||||
|
"print(sum(ug))\n",
|
||||||
|
"print(ug_mse(ug, calc_theoretical(grid)))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## схема Кранка-Николсон"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 79,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def calc_kn(grid):\n",
|
||||||
|
" ug = zeros((grid.K + 1, grid.I + 1), dtype=float)\n",
|
||||||
|
"\n",
|
||||||
|
" ug[0, :] = sin(np.pi * grid.xs / l_float) ** 2 * 4 / 10\n",
|
||||||
|
"\n",
|
||||||
|
" for k in range(1, grid.K + 1):\n",
|
||||||
|
" diags = {\n",
|
||||||
|
" -1: np.zeros(grid.I + 1, dtype=float),\n",
|
||||||
|
" 0: np.zeros(grid.I + 1, dtype=float),\n",
|
||||||
|
" +1: np.zeros(grid.I + 1, dtype=float),\n",
|
||||||
|
" }\n",
|
||||||
|
" b = np.zeros(grid.I + 1, dtype=float)\n",
|
||||||
|
"\n",
|
||||||
|
" # left\n",
|
||||||
|
" diags[ 0][0] = H_float + 1 / grid.h_x\n",
|
||||||
|
" diags[+1][0] = -1 / grid.h_x\n",
|
||||||
|
"\n",
|
||||||
|
" # middle\n",
|
||||||
|
" for i in range(1, grid.I):\n",
|
||||||
|
" diags[-1][i] = grid.gamma\n",
|
||||||
|
" diags[ 0][i] = - 2 * grid.gamma - 2\n",
|
||||||
|
" diags[+1][i] = grid.gamma\n",
|
||||||
|
" b[i] = -(\n",
|
||||||
|
" ug[k - 1][i - 1] * grid.gamma +\n",
|
||||||
|
" ug[k - 1][i] * (-2 * grid.gamma + 2) +\n",
|
||||||
|
" ug[k - 1][i + 1] * grid.gamma\n",
|
||||||
|
" )\n",
|
||||||
|
"\n",
|
||||||
|
" # right\n",
|
||||||
|
" diags[ 0][grid.I] = H_float + 1 / grid.h_x\n",
|
||||||
|
" diags[-1][grid.I] = -1 / grid.h_x\n",
|
||||||
|
"\n",
|
||||||
|
" A = scipy.sparse.diags([\n",
|
||||||
|
" diags[-1][1:], \n",
|
||||||
|
" diags[ 0], \n",
|
||||||
|
" diags[+1][:-1],\n",
|
||||||
|
" ], [-1, 0, 1], format='csc')\n",
|
||||||
|
" \n",
|
||||||
|
" ug[k, :] = scipy.sparse.linalg.spsolve(A, b)\n",
|
||||||
|
" \n",
|
||||||
|
" return ug"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 15,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"0.048762671501371764\n",
|
||||||
|
"5.115545125775158e-07\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"grid = Grid(10, 50)\n",
|
||||||
|
"ug = calc_kn(grid)\n",
|
||||||
|
"print(mean(ug[-1]))\n",
|
||||||
|
"print(ug_mse(ug, calc_theoretical(grid)))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## простейшая неявная схема повышенного порядка аппроксимации"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 174,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def calc_implicit_improved(grid):\n",
|
||||||
|
" ug = zeros((grid.K + 1, grid.I + 1), dtype=float)\n",
|
||||||
|
"\n",
|
||||||
|
" ug[0, :] = sin(np.pi * grid.xs / l_float) ** 2 * 4 / 10\n",
|
||||||
|
"\n",
|
||||||
|
" for k in range(1, grid.K + 1):\n",
|
||||||
|
" diags = {\n",
|
||||||
|
" -1: np.zeros(grid.I + 1, dtype=float),\n",
|
||||||
|
" 0: np.zeros(grid.I + 1, dtype=float),\n",
|
||||||
|
" +1: np.zeros(grid.I + 1, dtype=float),\n",
|
||||||
|
" }\n",
|
||||||
|
" b = np.zeros(grid.I + 1, dtype=float)\n",
|
||||||
|
"\n",
|
||||||
|
" # left\n",
|
||||||
|
" diags[ 0][0] = (\n",
|
||||||
|
" 2 * H_float * grid.gamma * grid.h_x + \n",
|
||||||
|
" 2 * grid.gamma + \n",
|
||||||
|
" 1\n",
|
||||||
|
" )\n",
|
||||||
|
" diags[+1][0] = - 2 * grid.gamma\n",
|
||||||
|
" b[0] = ug[k - 1, 0]\n",
|
||||||
|
"\n",
|
||||||
|
" # middle\n",
|
||||||
|
" for i in range(1, grid.I):\n",
|
||||||
|
" diags[-1][i] = grid.gamma\n",
|
||||||
|
" diags[ 0][i] = - 2 * grid.gamma - 1\n",
|
||||||
|
" diags[+1][i] = grid.gamma\n",
|
||||||
|
" b[i] = -ug[k - 1, i]\n",
|
||||||
|
"\n",
|
||||||
|
" # right\n",
|
||||||
|
" diags[ 0][grid.I] = (\n",
|
||||||
|
" 2 * H_float * grid.gamma * grid.h_x + \n",
|
||||||
|
" 2 * grid.gamma + \n",
|
||||||
|
" 1\n",
|
||||||
|
" )\n",
|
||||||
|
" diags[-1][grid.I] = - 2 * grid.gamma\n",
|
||||||
|
" b[grid.I] = ug[k - 1, grid.I]\n",
|
||||||
|
"\n",
|
||||||
|
" A = scipy.sparse.diags([\n",
|
||||||
|
" diags[-1][1:], \n",
|
||||||
|
" diags[ 0], \n",
|
||||||
|
" diags[+1][:-1],\n",
|
||||||
|
" ], [-1, 0, 1], format='csc')\n",
|
||||||
|
" \n",
|
||||||
|
" ug[k, :] = scipy.sparse.linalg.spsolve(A, b)\n",
|
||||||
|
" \n",
|
||||||
|
" return ug"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 177,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"59.486724613775095\n",
|
||||||
|
"4.014426575945732e-06\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"grid = Grid(10, 50)\n",
|
||||||
|
"ug = calc_implicit_improved(grid)\n",
|
||||||
|
"print(sum(ug))\n",
|
||||||
|
"print(ug_mse(ug, calc_theoretical(grid)))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Кранк-Николсон повышенного порядка аппроксимации"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 174,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def calc_kn_improved(grid):\n",
|
||||||
|
" ug = zeros((grid.K + 1, grid.I + 1), dtype=float)\n",
|
||||||
|
"\n",
|
||||||
|
" ug[0, :] = sin(np.pi * grid.xs / l_float) ** 2 * 4 / 10\n",
|
||||||
|
"\n",
|
||||||
|
" for k in range(1, grid.K + 1):\n",
|
||||||
|
" diags = {\n",
|
||||||
|
" -1: np.zeros(grid.I + 1, dtype=float),\n",
|
||||||
|
" 0: np.zeros(grid.I + 1, dtype=float),\n",
|
||||||
|
" +1: np.zeros(grid.I + 1, dtype=float),\n",
|
||||||
|
" }\n",
|
||||||
|
" b = np.zeros(grid.I + 1, dtype=float)\n",
|
||||||
|
"\n",
|
||||||
|
" # left\n",
|
||||||
|
" #diags[ 0][0] = H_float + 1 / grid.h_x\n",
|
||||||
|
" #diags[+1][0] = -1 / grid.h_x\n",
|
||||||
|
" \n",
|
||||||
|
" diags[ 0][0] = (\n",
|
||||||
|
" 2 * H_float * grid.gamma * grid.h_x + \n",
|
||||||
|
" 2 * grid.gamma + \n",
|
||||||
|
" 1\n",
|
||||||
|
" )\n",
|
||||||
|
" diags[+1][0] = - 2 * grid.gamma\n",
|
||||||
|
" b[0] = ug[k - 1, 0]\n",
|
||||||
|
"\n",
|
||||||
|
" # middle\n",
|
||||||
|
" for i in range(1, grid.I):\n",
|
||||||
|
" diags[-1][i] = grid.gamma\n",
|
||||||
|
" diags[ 0][i] = - 2 * grid.gamma - 2\n",
|
||||||
|
" diags[+1][i] = grid.gamma\n",
|
||||||
|
" b[i] = -(\n",
|
||||||
|
" ug[k - 1][i - 1] * grid.gamma +\n",
|
||||||
|
" ug[k - 1][i] * (-2 * grid.gamma + 2) +\n",
|
||||||
|
" ug[k - 1][i + 1] * grid.gamma\n",
|
||||||
|
" )\n",
|
||||||
|
"\n",
|
||||||
|
" # right\n",
|
||||||
|
" diags[ 0][grid.I] = H_float + 1 / grid.h_x\n",
|
||||||
|
" diags[-1][grid.I] = -1 / grid.h_x\n",
|
||||||
|
"\n",
|
||||||
|
" A = scipy.sparse.diags([\n",
|
||||||
|
" diags[-1][1:], \n",
|
||||||
|
" diags[ 0], \n",
|
||||||
|
" diags[+1][:-1],\n",
|
||||||
|
" ], [-1, 0, 1], format='csc')\n",
|
||||||
|
" \n",
|
||||||
|
" ug[k, :] = scipy.sparse.linalg.spsolve(A, b)\n",
|
||||||
|
" \n",
|
||||||
|
" return ug"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 177,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"59.486724613775095\n",
|
||||||
|
"4.014426575945732e-06\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"grid = Grid(10, 50)\n",
|
||||||
|
"ug = calc_kn_improved(grid)\n",
|
||||||
|
"print(sum(ug))\n",
|
||||||
|
"print(ug_mse(ug, calc_theoretical(grid)))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## сравнение"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 128,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAAAPBAMAAAAR2O42AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMpndu3bvImbNiRBUq0Qb3U6NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADlklEQVQ4Eb2TT4hbVRTGf8nkz5u8JBN0J8jEwT906rSDFUrFYlDRjdqhIGqlTIRS0Rlq6KLKbPo2yuCmEV0IVYnakTEgBksLFiRv5a4kDnQYhdKg6LbS/zNJTc8596UdU9deeCffO/d835dz3r0A98gDC/UXiO2erNcNuXBq3zbwJz8skK6fCOGH5S+lsr6voAS4d6VerxkafT32qAENqpdZ0srhZVK3WY/rdrpIK/D6/f5NQxYokgsZDf2dHCZ7Az7jZIUfO/Eq/NyAY1LeJjsHqX6/JiKaBNHzv2CLwqFlUo4FyQO6m+wxNh2vQNuQhWxAusoH8C2zIZfxymSqPE2i5K9cEItHIMdPU10Y/e4VMbOk6SWKPDvkqa8mZSx5ee8TTeUP0axmZEAFQ+61hD/Ni9Bq/NXx10lIc938dS1nVnxrINNMim/OcpY0vYvSwH8sk6oZS9jmK1WtQMKf8jjUCvJXGpmAm3AxROc81ibfS5S1wlmQn7nbV/Wes5q7QiSlLLxK5Os/oXUleQxpuHBjGf+S+ErhyRrNIvmrYx8tyWGLfBOCrN/FvYUoaXrr9+3twJmXZaab1kBKWZzC+aa/3ipv0h+GLGT6x0lvwHiNhccaHK0R22h+Sioc+C7jfBON9D8Cdfiq568HzJPfyYIk76xICmXJRxrM+ZsONK1KERLO/nGtk5Z+xZfMIY4W1bdLXE6wWuD/LUH7lfWMPO6ji2+/wcONI6H/gG0NQiRlrGzhtm9K5F6zGkWk5rw2s3OD4XCw4eY8jSe9mW+yKnWR7/aKJZ3eZblkndX3X7U/9/EOWbsK8jfdJzPWGZxvukKiZ3fPkIVUhVhPz1UrfBf2hHKusr2RKp5cZfMdKUW+v8L3HUs6vV3iGwhxaJkUxjp7/vy1c7I91lVfX3YMWdChr+lFPNaQwe0JEyW8bq58p99mWyq037dgu/Qmf8bprWq/G0OuOCmMJXsHdD9VYuQ6MZmEIRcq8Lxe9i1a81TFKxOvxuT7lqN+x4vCVF/5lRbdELR2XL4vb8ueJDctk8JYkr0i5w8voDVDVnwNWcgfx5thJPTfYJHsVXiS0wV+43QYWbSKQlffw3hvCrThix65mj8vZ8X/9z1yUhgLTvTX2A2/T7wkV2he2IYs3D+5TU7D0v4C+YkHO3ohf5GDPSFh6p3PAzgSQnx1fY305IqM2SVVj6+mCiQfWhS1zcukjLU5+3/iW7ckZCmz5Ei9AAAAAElFTkSuQmCC\n",
|
||||||
|
"text/latex": [
|
||||||
|
"$$4.3733803061715146e-07$$"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
"4.3733803061715146e-07"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 128,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"ug_mse(calc_theoretical(grid), calc_explicit(grid))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 169,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def print_comparison(Is, Ks, E, i_p, k_p, i_d, k_d):\n",
|
||||||
|
" if (\n",
|
||||||
|
" not 0 <= i_p < len(Is) or\n",
|
||||||
|
" not 0 <= k_p < len(Ks) or\n",
|
||||||
|
" not 0 <= i_p + i_d < len(Is) or\n",
|
||||||
|
" not 0 <= k_p + k_d < len(Ks) or\n",
|
||||||
|
" E[k_p, i_p] < 0 or\n",
|
||||||
|
" E[k_p + k_d, i_p + i_d] < 0\n",
|
||||||
|
" ):\n",
|
||||||
|
" return\n",
|
||||||
|
" \n",
|
||||||
|
" error_ratio = E[k_p, i_p] / E[k_p + k_d, i_p + i_d]\n",
|
||||||
|
" \n",
|
||||||
|
" I1 = Is[i_p]\n",
|
||||||
|
" I2 = Is[i_p + i_d]\n",
|
||||||
|
" K1 = Ks[k_p]\n",
|
||||||
|
" K2 = Ks[k_p + k_d]\n",
|
||||||
|
" \n",
|
||||||
|
" print(f'h_x x{I2//I1} h_t x{K2//K1} @ ({I1:5},{K1:5}): {error_ratio}')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 170,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def compare_errors(Is, Ks, calc_function):\n",
|
||||||
|
" E = np.zeros((len(Ks), len(Is)))\n",
|
||||||
|
"\n",
|
||||||
|
" for k_p in range(len(Ks)):\n",
|
||||||
|
" for i_p in range(len(Is)):\n",
|
||||||
|
" grid = Grid(Is[i_p], Ks[k_p])\n",
|
||||||
|
"\n",
|
||||||
|
" try:\n",
|
||||||
|
" error = ug_mae(calc_function(grid), calc_theoretical(grid))\n",
|
||||||
|
" except:\n",
|
||||||
|
" error = -1\n",
|
||||||
|
"\n",
|
||||||
|
" E[k_p, i_p] = error\n",
|
||||||
|
" \n",
|
||||||
|
" for k_p in range(len(Ks)):\n",
|
||||||
|
" for i_p in range(len(Is)):\n",
|
||||||
|
" print_comparison(Is, Ks, E, i_p, k_p, +1, +1)\n",
|
||||||
|
" \n",
|
||||||
|
" for k_p in range(len(Ks)):\n",
|
||||||
|
" for i_p in range(len(Is)):\n",
|
||||||
|
" print_comparison(Is, Ks, E, i_p, k_p, +2, +1)\n",
|
||||||
|
" \n",
|
||||||
|
" for k_p in range(len(Ks)):\n",
|
||||||
|
" for i_p in range(len(Is)):\n",
|
||||||
|
" print_comparison(Is, Ks, E, i_p, k_p, +1, +2)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 171,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"h_x x2 h_t x4 @ ( 16, 256): 1.919077767270527\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"compare_errors([16, 32, 64, 128, 256], [256, 1024], calc_explicit)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 172,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"h_x x2 h_t x2 @ ( 16, 16): 1.8945839194805507\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 32, 16): 1.8480652483857702\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 64, 16): 1.825718428756318\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 128, 16): 1.8200879583854386\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 16, 32): 2.011003900865954\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 32, 32): 1.8852164156444766\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 64, 32): 1.8445734893796497\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 128, 32): 1.8438755692851074\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 16, 64): 2.17619657916294\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 32, 64): 1.9562383707853712\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 64, 64): 1.912181287104185\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 128, 64): 1.9058730801460957\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 16, 128): 2.3986401861806734\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 32, 128): 2.066009495516749\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 64, 128): 1.9741429057474853\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 128, 128): 1.955899186659026\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 16, 16): 1.9431575629889533\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 32, 16): 1.8496006164556726\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 64, 16): 1.8261475842007147\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 16, 32): 2.0776417503976705\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 32, 32): 1.8918649575362794\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 64, 32): 1.845407456579902\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 16, 64): 2.326489502477712\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 32, 64): 1.9755444903443895\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 64, 64): 1.9125944713395193\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 16, 128): 2.8326076010600714\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 32, 128): 2.1104815578650395\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 64, 128): 1.9752019588093679\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 16, 16): 3.45714271998841\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 32, 16): 3.396912364589268\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 64, 16): 3.3648762818042726\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 128, 16): 3.3552270369444783\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 16, 32): 3.6798635241236157\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 32, 32): 3.569646703206942\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 64, 32): 3.514763487476464\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 128, 32): 3.512604694405925\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 16, 64): 3.8072301037478553\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 32, 64): 3.780516278348026\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 64, 64): 3.7380285131624063\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 128, 64): 3.726890300676519\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"compare_errors([16, 32, 64, 128, 256], [16, 32, 64, 128, 256], calc_implicit)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 173,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"h_x x2 h_t x2 @ ( 16, 16): 1.7867407245342732\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 32, 16): 2.0659339289789247\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 64, 16): 2.206577164218172\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 128, 16): 2.205398898130605\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 16, 32): 1.0260466758467883\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 32, 32): 1.985994321847054\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 64, 32): 2.0974055723617107\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 128, 32): 2.1318052621473274\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 16, 64): 1.8854175495471748\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 32, 64): 1.5501374544674071\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 64, 64): 2.0605293935478826\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 128, 64): 2.1241455078974423\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 16, 128): 2.2073516657031678\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 32, 128): 1.8202146022973351\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 64, 128): 1.8615590435162546\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 128, 128): 2.093178235555532\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 16, 16): 1.5416112730228488\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 32, 16): 1.9411758005230835\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 64, 16): 2.132375626592411\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 16, 32): 0.672923482269376\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 32, 32): 1.8096548816821525\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 64, 32): 2.0030692793517577\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 16, 64): 2.09685316770308\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 32, 64): 1.3513796667001667\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 64, 64): 1.9355394149338634\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 16, 128): 5.089679627450866\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 32, 128): 2.07031910687416\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 64, 128): 1.8247920519286784\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 16, 16): 5.410544492760973\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 32, 16): 4.755334696107873\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 64, 16): 4.925531450048806\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 128, 16): 4.865081194253896\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 16, 32): 1.4301343984858494\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 32, 32): 4.6940709147810455\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 64, 32): 4.742894620222057\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 128, 32): 4.7415271368204355\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 16, 64): 1.4883710757235502\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 32, 64): 2.537069293873301\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 64, 64): 4.399957273891053\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 128, 64): 4.733335280216436\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"compare_errors([16, 32, 64, 128, 256], [16, 32, 64, 128, 256], calc_kn)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 181,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"h_x x2 h_t x2 @ ( 32, 128): 2.038390823677269\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 64, 128): 1.9736276882133699\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 32, 256): 2.1614872398503246\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 64, 256): 2.025328231523804\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 32, 512): 2.373745419372439\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 64, 512): 2.0878950429120877\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 32, 1024): 2.713172301556474\n",
|
||||||
|
"h_x x2 h_t x2 @ ( 64, 1024): 2.185936854335897\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 32, 128): 2.1195416132190292\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 32, 256): 2.330981592342115\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 32, 512): 2.7365187229137757\n",
|
||||||
|
"h_x x4 h_t x2 @ ( 32, 1024): 3.543382713251337\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 32, 128): 3.8282183811233788\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 64, 128): 3.8442015881699336\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 32, 256): 3.9146871029344097\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 64, 256): 3.921190229218736\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 32, 512): 3.973114349424527\n",
|
||||||
|
"h_x x2 h_t x4 @ ( 64, 512): 3.958967998390918\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"compare_errors([32, 64, 128], [128, 256, 512, 1024, 2048], calc_implicit_improved)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.7.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 2
|
||||||
|
}
|
BIN
разностные схемы.docx
Normal file
BIN
разностные схемы.docx
Normal file
Binary file not shown.
BIN
разностные схемы.pdf
Normal file
BIN
разностные схемы.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user