diff options
author | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2025-03-29 12:23:08 -0300 |
---|---|---|
committer | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2025-03-29 12:23:08 -0300 |
commit | bdf7b97b2e2d5efc4c2b5fee2868dfc33c891d16 (patch) | |
tree | 0234be68ca0682223a716379aa315031c4d347ca | |
parent | 5bf9d56ab096878498eee9a8b91a093a494910f0 (diff) | |
download | code-bdf7b97b2e2d5efc4c2b5fee2868dfc33c891d16.tar.gz code-bdf7b97b2e2d5efc4c2b5fee2868dfc33c891d16.tar.bz2 code-bdf7b97b2e2d5efc4c2b5fee2868dfc33c891d16.zip |
Fixed several bugs.
-rw-r--r-- | integrator.cpp | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/integrator.cpp b/integrator.cpp index bb22a36..ea5c477 100644 --- a/integrator.cpp +++ b/integrator.cpp @@ -16,29 +16,43 @@ public: } }; +unsigned p = 3; + Real f(Real q) { - return 0.5 * pow(q, 2); + return 0.5 * pow(q, p); } Real df(Real q) { - return q; + return 0.5 * p * pow(q, p - 1); } Real ddf(Real q) { - return 1; + return 0.5 * p * (p - 1) * pow(q, p - 2); } Real integrate(const std::vector<Point>& Cₜ) { Real I = 0; for (unsigned i = 0; i < Cₜ.size() - 1; i++) { + unsigned j = Cₜ.size() - 1 - i; Real Δτ = Cₜ[i + 1].τ() - Cₜ[i].τ(); - Real C = (Cₜ[i + 1].C() + Cₜ[i].C()) / 2; + Real C = (Cₜ[j].C() + Cₜ[j - 1].C()) / 2; Real dC = (Cₜ[i + 1].C() - Cₜ[i].C()) / Δτ; I += Δτ * df(C) * dC; } return I; } +Real energy(const std::vector<Point>& Ct) { + Real I = 0; + for (unsigned i = 0; i < Ct.size() - 1; i++) { + Real Δτ = Ct[i + 1].τ() - Ct[i].τ(); + Real C = (Ct[i].C() + Ct[i + 1].C()) / 2; + Real dC = (Ct[i + 1].C() - Ct[i].C()) / Δτ; + I += Δτ * df(C) * dC; + } + return I; +} + int main(int argc, char* argv[]) { Real Δτ = 1e-3; Real τₘₐₓ = 1e3; @@ -66,20 +80,20 @@ int main(int argc, char* argv[]) { } } + Real z = 0.5 + 0.0 * pow(y, 2); + std::vector<Point> Cₜ; - Cₜ.reserve(τₘₐₓ / Δτ); + Cₜ.reserve(τₘₐₓ / Δτ + 1); Cₜ.push_back({0, 1}); - Cₜ.push_back({Δτ, 1 - Δτ}); while (Cₜ.back().τ() < τₘₐₓ) { - Real dC = -Cₜ.back().C() - 2 * pow(y, 2) * integrate(Cₜ); + Real dC = -z * Cₜ.back().C() - 2 * pow(y, 2) * integrate(Cₜ); Cₜ.push_back({Cₜ.back().τ() + Δτ, Cₜ.back().C() + Δτ * dC}); + std::cout << Cₜ.back().τ() << " " << Cₜ.back().C() << std::endl; } - for (const Point& p : Cₜ) { - std::cout << p.τ() << " " << p.C() << std::endl; - } + std::cerr << - 2 * y * energy(Cₜ) << std::endl; return 0; } |