Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
VectorRootSolver.h
Go to the documentation of this file.
1#pragma once
2#include <array>
3#include <functional>
4#include <glm/glm.hpp>
5
6#include "ISolver.h"
7
20template<typename InputT, typename OutputT>
21class VectorRootSolver : public ISolver {
22public:
23 using InitialGuessSetter = std::function<void(const InputT&)>; // Sets the value for the unknown parameter we are solving for
24 using StopCondition = std::function<bool()>; // Runs the simulation up until a stop condition is reached
25 using ResultExtractor = std::function<OutputT()>; // Gets a value to compare to the target value after an iteration
26
39 VectorRootSolver(InitialGuessSetter initialGuessSetter,
40 StopCondition stopCondition,
41 ResultExtractor extractResult,
42 const OutputT& target,
43 double tolerance = 1e-3,
44 int maxIterations = 30,
45 double jacobianStep = 0.01,
46 double damping = 1.0);
47
68 bool stepFrame() override;
69
70private:
71 enum class SolverState {
72 WaitingForBase, PerturbComponent, WaitingForPerturbed, ComputeJacobian
73 };
74 SolverState state;
75
76 InitialGuessSetter setGuess;
77 StopCondition stopCondition;
78 ResultExtractor extract;
79
80 InputT current; // current guess for unknown(s)
81 glm::vec3 target;
82 glm::vec3 baseOutput;
83 glm::vec3 xPerturbed;
84 std::array<glm::vec3, 3> fPerturbed;
85
86 int currentPerturbation = -1;
87 int iterationCount = 0;
88 int maxIterations;
89 float h;
90 float tolerance;
91 float alpha;
92};
Abstract interface for numerical solvers.
Abstract base class for all numerical solvers.
Definition ISolver.h:59
A vector-valued root solver using Newton's method.
std::function< void(const InputT &)> InitialGuessSetter
std::function< OutputT()> ResultExtractor
bool stepFrame() override
Performs one iteration of the vector root-finding solver.
std::function< bool()> StopCondition