This commit is contained in:
William Ball 2021-06-25 10:52:42 -04:00
parent 359c25e031
commit 6fd0257f4d
5 changed files with 214 additions and 426 deletions

View file

@ -1,25 +1,12 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "addr2line"
version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a"
dependencies = [
"gimli",
]
[[package]]
name = "adler"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
version = 3
[[package]]
name = "approx"
version = "0.5.0"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "072df7202e63b127ab55acfe16ce97013d5b97bf160489336d3f1840fd78e99e"
checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278"
dependencies = [
"num-traits",
]
@ -31,36 +18,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
[[package]]
name = "backtrace"
version = "0.3.60"
name = "bacon-sci"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7815ea54e4d821e791162e078acbebfd6d8c8939cd559c9335dceb1c8ca7282"
checksum = "e5d568d86ec0ca7d24caa67afff9605bc5bc3cae2642d6670ea5924b839ccabc"
dependencies = [
"addr2line",
"cc",
"cfg-if",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
"nalgebra",
"num-complex",
"num-traits",
"phf",
"phf_codegen",
]
[[package]]
name = "bai_finch"
version = "0.1.0"
dependencies = [
"gad",
"bacon-sci",
"nalgebra",
"num",
"peroxide",
"num-complex",
"simba",
]
[[package]]
name = "cc"
version = "1.0.68"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787"
[[package]]
name = "cfg-if"
version = "1.0.0"
@ -68,76 +48,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "crossbeam-channel"
version = "0.5.1"
name = "generic-array"
version = "0.14.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4"
checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
dependencies = [
"cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db"
dependencies = [
"cfg-if",
"lazy_static",
]
[[package]]
name = "gad"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2b94905d25b4e536e7622e6cb447d722bae8fb0f2dd65eb2196c18e40bf54d1"
dependencies = [
"backtrace",
"id-arena",
"num",
"serde",
"thiserror",
"typenum",
"version_check",
]
[[package]]
name = "getrandom"
version = "0.2.3"
version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753"
checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]]
name = "gimli"
version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189"
[[package]]
name = "hermit-abi"
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c"
dependencies = [
"libc",
]
[[package]]
name = "id-arena"
version = "2.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005"
[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
version = "0.2.97"
@ -152,64 +82,36 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a"
[[package]]
name = "matrixmultiply"
version = "0.3.1"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a8a15b776d9dfaecd44b03c5828c2199cddff5247215858aac14624f8d6b741"
checksum = "916806ba0031cd542105d916a97c8572e1fa6dd79c9c51e7eb43a09ec2dd84c1"
dependencies = [
"num_cpus",
"once_cell",
"rawpointer",
"thread-tree",
]
[[package]]
name = "memchr"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc"
[[package]]
name = "miniz_oxide"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b"
dependencies = [
"adler",
"autocfg",
]
[[package]]
name = "nalgebra"
version = "0.27.1"
version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "462fffe4002f4f2e1f6a9dcf12cc1a6fc0e15989014efc02a941d3e0f5dc2120"
checksum = "1a9002895a0de45e3cde58b36d0cf2f83249e7dba4a43ee64dafbf01bfd464ff"
dependencies = [
"approx",
"generic-array",
"matrixmultiply",
"nalgebra-macros",
"num-complex",
"num-rational",
"num-traits",
"rand",
"rand_distr",
"simba",
"typenum",
]
[[package]]
name = "nalgebra-macros"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "num"
version = "0.4.0"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606"
checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f"
dependencies = [
"num-bigint",
"num-complex",
@ -221,24 +123,22 @@ dependencies = [
[[package]]
name = "num-bigint"
version = "0.4.0"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e0d047c1062aa51e256408c560894e5251f08925980e53cf1aa5bd00eec6512"
checksum = "7d0a3d5e207573f948a9e5376662aa743a2ea13f7c50a554d7af443a73fbfeba"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
"serde",
]
[[package]]
name = "num-complex"
version = "0.4.0"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085"
checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5"
dependencies = [
"num-traits",
"serde",
]
[[package]]
@ -264,15 +164,14 @@ dependencies = [
[[package]]
name = "num-rational"
version = "0.4.0"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a"
checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
dependencies = [
"autocfg",
"num-bigint",
"num-integer",
"num-traits",
"serde",
]
[[package]]
@ -285,37 +184,6 @@ dependencies = [
"libm",
]
[[package]]
name = "num_cpus"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
name = "object"
version = "0.25.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56"
[[package]]
name = "order-stat"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "efa535d5117d3661134dbf1719b6f0ffe06f2375843b13935db186cd094105eb"
[[package]]
name = "paste"
version = "1.0.5"
@ -323,27 +191,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58"
[[package]]
name = "peroxide"
version = "0.30.9"
name = "phf"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acb182c4e420fa22bc0a6a9eecb4162c744d8262b7ce238a424aff7fd301735c"
checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
dependencies = [
"matrixmultiply",
"order-stat",
"peroxide-ad",
"puruspe",
"rand",
"rand_distr",
"phf_shared",
]
[[package]]
name = "peroxide-ad"
version = "0.3.0"
name = "phf_codegen"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6fba8ff3f40b67996f7c745f699babaa3e57ef5c8178ec999daf7eedc51dc8c"
checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
dependencies = [
"quote",
"syn",
"phf_generator",
"phf_shared",
]
[[package]]
name = "phf_generator"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
dependencies = [
"phf_shared",
"rand",
]
[[package]]
name = "phf_shared"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
dependencies = [
"siphasher",
]
[[package]]
@ -352,47 +234,25 @@ version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
[[package]]
name = "proc-macro2"
version = "1.0.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038"
dependencies = [
"unicode-xid",
]
[[package]]
name = "puruspe"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b7e158a385023d209d6d5f2585c4b468f6dcb3dd5aca9b75c4f1678c05bb375"
[[package]]
name = "quote"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rand"
version = "0.8.4"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8"
checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
dependencies = [
"getrandom",
"libc",
"rand_chacha",
"rand_core",
"rand_hc",
"rand_pcg",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
dependencies = [
"ppv-lite86",
"rand_core",
@ -400,18 +260,18 @@ dependencies = [
[[package]]
name = "rand_core"
version = "0.6.3"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
dependencies = [
"getrandom",
]
[[package]]
name = "rand_distr"
version = "0.4.1"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "051b398806e42b9cd04ad9ec8f81e355d0a382c543ac6672c62f5a5b452ef142"
checksum = "c9e9532ada3929fb8b2e9dbe28d1e06c9b2cc65813f074fcb6bd5fbefeff9d56"
dependencies = [
"num-traits",
"rand",
@ -419,9 +279,18 @@ dependencies = [
[[package]]
name = "rand_hc"
version = "0.3.1"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7"
checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
dependencies = [
"rand_core",
]
[[package]]
name = "rand_pcg"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
dependencies = [
"rand_core",
]
@ -432,37 +301,11 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
[[package]]
name = "rustc-demangle"
version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49"
[[package]]
name = "serde"
version = "1.0.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "simba"
version = "0.5.1"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e82063457853d00243beda9952e910b82593e4b07ae9f721b9278a99a0d3d5c"
checksum = "17bfe642b1728a6e89137ad428ef5d4738eca4efaba9590f9e110b8944028621"
dependencies = [
"approx",
"num-complex",
@ -471,44 +314,10 @@ dependencies = [
]
[[package]]
name = "syn"
version = "1.0.73"
name = "siphasher"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7"
dependencies = [
"proc-macro2",
"quote",
"unicode-xid",
]
[[package]]
name = "thiserror"
version = "1.0.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa6f76457f59514c7eeb4e59d891395fab0b2fd1d40723ae737d64153392e9c6"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "thread-tree"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd15110864dc0eccbd281d13c15a5863f7739a6fbcf710190a6d13e797aa1a57"
dependencies = [
"crossbeam-channel",
]
checksum = "cbce6d4507c7e4a3962091436e56e95290cb71fa302d0d270e32130b75fbff27"
[[package]]
name = "typenum"
@ -517,13 +326,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06"
[[package]]
name = "unicode-xid"
version = "0.2.2"
name = "version_check"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
[[package]]
name = "wasi"
version = "0.10.2+wasi-snapshot-preview1"
version = "0.9.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"

View file

@ -7,7 +7,8 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
num = "0.4.0"
nalgebra = "0.27.1"
peroxide = "0.30"
gad = "0.2.0"
num = "0.3.1"
nalgebra = "0.24.1"
bacon-sci = "*"
simba = "0.3.1"
num-complex = "0.3.1"

View file

@ -0,0 +1,57 @@
use num_complex::Complex64;
use simba::scalar::ComplexField;
use std::f64::consts::PI;
pub type CFunction<'a> = &'a dyn Fn(Complex64) -> Complex64;
pub type Path<'a> = &'a dyn Fn(f64) -> Complex64;
pub type Rule<'a> = &'a dyn Fn(CFunction, Complex64, Complex64) -> Complex64;
pub fn unit_circle(t: f64) -> Complex64 {
num::Complex::new((2.0 * PI * t).cos(), (2.0 * PI * t).sin())
}
pub fn trapezoid(f: CFunction, a: Complex64, b: Complex64) -> Complex64 {
0.5 * (b - a) * (f(a) + f(b))
}
fn factorial(n: i32) -> i32 {
(1..=n).product()
}
fn test(t: f64) -> Complex64 {
1.0 / unit_circle(t)
}
// pub fn diff(fun: CFunction, a: Complex64, n: i32) -> Result<Complex64, String> {
// let f = |t: f64| -> Complex64 {
// let z = unit_circle(t);
// fun(z) / (z - a).powi(n + 1)
// };
// let integral = bacon_sci::integrate::integrate_fixed(0f64, 1f64, f, 10)?;
// Ok(integral * Complex64::new(factorial(n) as f64, 0.0) / Complex64::new(0.0, 2.0 * PI))
// }
pub fn diff(fun: CFunction, a: Complex64, n: i32) -> Result<Complex64, String> {
let f = |z: Complex64| -> Complex64 {
fun(z) / (z - a).powi(n + 1)
};
let integral = integrate(&f, &unit_circle, &trapezoid);
Ok(integral * Complex64::new(factorial(n) as f64, 0.0) / Complex64::new(0.0, 2.0 * PI))
}
pub fn integrate(f: CFunction, path: Path, rule: Rule) -> Complex64 {
let increment = 0.00001;
let mut integral = Complex64::new(0.0, 0.0);
let mut i = increment;
let mut previous_point = path(0.0);
while i <= 1.0 {
let point = path(i);
integral += rule(f, previous_point, point);
previous_point = point;
i += increment;
}
integral
}

View file

@ -1,143 +1,32 @@
use gad::prelude::*;
use nalgebra::{SMatrix, SVector};
use num::Complex;
#![allow(dead_code)]
mod diff;
use diff::*;
use num_complex::Complex64;
use std::f64::consts::PI;
// use nalgebra::{SMatrix, SVector};
type F = f64;
type Matrix2x2 = SMatrix<Complex<F>, 2, 2>;
// type NComplex = num::Complex<F>;
// type Matrix2x2 = SMatrix<num::Complex<F>, 2, 2>;
// type Complex = Complex64;
fn sum(
g: &mut GraphN,
ar: &Value<F>,
ai: &Value<F>,
br: &Value<F>,
bi: &Value<F>,
) -> Result<(Value<F>, Value<F>)> {
Ok((g.add(ar, br)?, g.add(ai, bi)?))
}
// fn power_method<const N: usize>(
// vec: SVector<NComplex, N>,
// mat: SMatrix<NComplex, N, N>,
// iterations: usize,
// ) -> NComplex {
// let mut current = vec;
// let mut previous = vec;
// for _ in 0..iterations {
// previous = current;
// current = mat * current;
// println!("current guess: {}", current[0] / previous[0]);
// }
fn product(
g: &mut GraphN,
ar: &Value<F>,
ai: &Value<F>,
br: &Value<F>,
bi: &Value<F>,
) -> Result<(Value<F>, Value<F>)> {
let t1 = g.mul(ar, br)?;
let t2 = g.mul(ai, bi)?;
let t3 = g.sub(&t1, &t2)?;
let s1 = g.mul(ar, bi)?;
let s2 = g.mul(ai, br)?;
let s3 = g.add(&s1, &s2)?;
Ok((t3, s3))
}
fn division(
g: &mut GraphN,
ar: &Value<F>,
ai: &Value<F>,
br: &Value<F>,
bi: &Value<F>,
) -> Result<(Value<F>, Value<F>)> {
let numerator1 = {
let t1 = g.mul(ar, br)?;
let t2 = g.mul(ai, bi)?;
g.add(&t1, &t2)?
};
let denominator1 = {
let t1 = g.mul(br, br)?;
let t2 = g.mul(bi, bi)?;
g.add(&t1, &t2)?
};
let numerator2 = {
let t1 = g.mul(ar, bi)?;
let t2 = g.mul(ai, br)?;
g.sub(&t1, &t2)?
};
let denominator2 = {
let t1 = g.mul(br, br)?;
let t2 = g.mul(bi, bi)?;
g.add(&t1, &t2)?
};
let f1 = g.div(&numerator1, &denominator1)?;
let f2 = g.div(&numerator2, &denominator2)?;
Ok((f1, f2))
}
fn mobius_derivative(mat: Matrix2x2) -> Result<(Value<F>, Value<F>)> {
let mut g = GraphN::new();
let x = g.variable(0.0);
let y = g.variable(0.0);
let a11r = g.constant(mat[(0, 0)].re);
let a12r = g.constant(mat[(0, 1)].re);
let a21r = g.constant(mat[(1, 0)].re);
let a22r = g.constant(mat[(1, 1)].re);
let a11i = g.constant(mat[(0, 0)].im);
let a12i = g.constant(mat[(0, 1)].im);
let a21i = g.constant(mat[(1, 0)].im);
let a22i = g.constant(mat[(1, 1)].im);
let (numeratorr, numeratori) = {
let (prodr, prodi) = product(&mut g, &x, &y, &a11r, &a11i)?;
sum(&mut g, &a12r, &a12i, &prodr, &prodi)?
};
let (denominatorr, denominatori) = {
let (prodr, prodi) = product(&mut g, &x, &y, &a21r, &a21i)?;
sum(&mut g, &a22r, &a22i, &prodr, &prodi)?
};
let (resultr, resulti) = division(
&mut g,
&numeratorr,
&numeratori,
&denominatorr,
&denominatori,
)?;
let x = x.gid()?;
let one = g.constant(1.0);
let one2 = g.constant(1.0);
let gradients1 = g.compute_gradients(resultr.gid()?, one)?;
let gradients2 = g.compute_gradients(resulti.gid()?, one2)?;
let du_dx = gradients1.get(x).unwrap();
let dv_dx = gradients2.get(x).unwrap();
Ok(Complex::new(*du_dx.data(), -*dv_dx.data()))
}
fn next_order_derivative(
g: &mut GraphN,
expr: &GradientId<F>,
var: &GradientId<F>,
) -> Result<Value<F>> {
let dz = g.constant(1.0);
let dz_d = g.compute_gradients(*expr, dz)?;
Ok(dz_d.get(*var).unwrap().clone())
}
fn power_method<const N: usize>(
vec: SVector<Complex<F>, N>,
mat: SMatrix<Complex<F>, N, N>,
iterations: usize,
) -> Complex<F> {
let mut current = vec;
let mut previous = vec;
for _ in 0..iterations {
previous = current;
current = mat * current;
println!("current guess: {}", current[0] / previous[0]);
}
current[0] / previous[0]
}
// current[0] / previous[0]
// }
fn secant_method(f: fn(F) -> F, x0: F, x1: F, accuracy: F, iterations: usize) -> F {
let mut x0 = x0;
@ -158,6 +47,13 @@ fn secant_method(f: fn(F) -> F, x0: F, x1: F, accuracy: F, iterations: usize) ->
x0
}
fn dzdt(t: f64) -> Complex64 {
Complex64::new(
-2.0 * PI * (-2.0 * PI * t).sin(),
2.0 * PI * ( 2.0 * PI * t).cos(),
)
}
fn main() {
// let g = Matrix2x2::new(
// Complex::new(2.0 / 12.0, -2.0 / 12.0),
@ -172,4 +68,29 @@ fn main() {
// Complex::new(0.0, 4.0 / 12.0),
// Complex::new(-6.0 / 12.0, -8.0 / 12.0),
// );
println!(
"{}",
diff(&|z: Complex64| z * z, Complex64::new(0.3, 0.3), 1).unwrap()
);
// println!(
// "{}",
// bacon_sci::integrate::integrate(
// 0.0,
// 1.0,
// &|t: f64| dzdt(t)
// / Complex64::new(
// (std::f64::consts::PI * 2.0 * t).cos(),
// (std::f64::consts::PI * 2.0 * t).sin()
// ),
// 0.001
// )
// .unwrap()
// );
println!(
"{}",
integrate(&|z: Complex64| 1.0 / z, &unit_circle, &trapezoid)
);
}