{"id":33938720,"url":"https://github.com/srenevey/ode-solvers","last_synced_at":"2026-04-02T02:17:17.399Z","repository":{"id":32970798,"uuid":"148226101","full_name":"srenevey/ode-solvers","owner":"srenevey","description":"Numerical methods to solve ordinary differential equations in Rust.","archived":false,"fork":false,"pushed_at":"2025-12-08T03:26:41.000Z","size":5340,"stargazers_count":78,"open_issues_count":7,"forks_count":32,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-12-14T03:13:09.545Z","etag":null,"topics":["ode-solver","odes","ordinary-differential-equations","rust-crate"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/srenevey.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-09-10T22:18:40.000Z","updated_at":"2025-12-08T03:26:45.000Z","dependencies_parsed_at":"2024-01-14T03:27:30.861Z","dependency_job_id":"70a09128-50f2-4d62-9bb8-a6197acdf884","html_url":"https://github.com/srenevey/ode-solvers","commit_stats":{"total_commits":57,"total_committers":8,"mean_commits":7.125,"dds":"0.26315789473684215","last_synced_commit":"4dd11075c9898b87f78a5b0b35131a749b5fd650"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/srenevey/ode-solvers","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srenevey%2Fode-solvers","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srenevey%2Fode-solvers/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srenevey%2Fode-solvers/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srenevey%2Fode-solvers/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/srenevey","download_url":"https://codeload.github.com/srenevey/ode-solvers/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srenevey%2Fode-solvers/sbom","scorecard":{"id":843746,"data":{"date":"2025-08-11","repo":{"name":"github.com/srenevey/ode-solvers","commit":"921857e6801efd2da4b09f704a4a1b5f9c09049a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4,"checks":[{"name":"Code-Review","score":3,"reason":"Found 6/16 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/rust.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/srenevey/ode-solvers/rust.yml/main?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: RUSTSEC-2024-0436"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 20 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T21:00:02.553Z","repository_id":32970798,"created_at":"2025-08-23T21:00:02.553Z","updated_at":"2025-08-23T21:00:02.553Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31294490,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T01:43:37.129Z","status":"online","status_checked_at":"2026-04-02T02:00:08.535Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ode-solver","odes","ordinary-differential-equations","rust-crate"],"created_at":"2025-12-12T15:03:41.667Z","updated_at":"2026-04-02T02:17:17.389Z","avatar_url":"https://github.com/srenevey.png","language":"Rust","readme":"# ODE-solvers\n\n[![Crates.io](https://img.shields.io/crates/v/ode_solvers.svg)](https://crates.io/crates/ode_solvers/) [![Docs](https://docs.rs/ode_solvers/badge.svg)](https://docs.rs/ode_solvers) [![Crates.io](https://img.shields.io/crates/l/ode_solvers.svg)](https://opensource.org/licenses/BSD-3-Clause)\n\n[Homepage](https://srenevey.github.io/ode-solvers/)    [Documentation](https://docs.rs/ode_solvers)\n\nNumerical methods to solve ordinary differential equations (ODEs) in Rust.\n\n\n\n## Installation\n\nTo start using the crate in a project, the following dependency must be added in the project's Cargo.toml file:\n\n```rust\n[dependencies]\node_solvers = \"0.6.1\"\n```\n\nThen, in the main file, add\n\n```rust\nuse ode_solvers::*;\n```\n\n\n\n## Type alias definition\n\nThe numerical integration methods implemented in the crate support multi-dimensional systems. In order to define the dimension of the system, declare a type alias for the state vector. For instance\n\n```rust\ntype State = Vector3\u003cf64\u003e;\n```\n\nThe state representation of the system is based on the SVector\u0026lt;T,D\u0026gt; structure defined in the [nalgebra](https://nalgebra.org/) crate. For convenience, ode-solvers re-exports six types to work with systems of dimension 1 to 6: Vector1\u0026lt;T\u0026gt;,..., Vector6\u0026lt;T\u0026gt;. For higher dimensions, the user should import the nalgebra crate and define a SVector\u0026lt;T,D\u0026gt;  where the second type parameter of SVector is a dimension. For instance, for a 9-dimensional system, one would have:\n\n```rust\ntype State = SVector\u003cf64, 9\u003e;\n```\n\nAlternativly, one can also use the DVector\u0026lt;T\u0026gt; structure from the [nalgebra](https://nalgebra.org/) crate as the state representation. When using a DVector\u0026lt;T\u0026gt;, the number of rows in the DVector\u0026lt;T\u0026gt; defines the dimension of the system.\n\n```rust\ntype State = DVector\u003cf64\u003e;\n```\n\n\n## System definition\n\nThe system of first order ODEs must be defined in the `system` method of the `System\u003cT, V\u003e` trait. Typically, this trait is defined for a structure containing some parameters of the model. The signature of the `System\u003cT, V\u003e` trait is:\n\n```rust\npub trait System\u003cT, V\u003e {\n    fn system(\u0026self, x: T, y: \u0026V, dy: \u0026mut V);\n    fn solout(\u0026self, _x: T, _y: \u0026V, _dy: \u0026V) -\u003e bool {\n        false\n    }\n}\n```\n\nwhere `system` must contain the ODEs: the second argument is the independent variable (usually time), the third one is a vector containing the dependent variable(s), and the fourth one contains the derivative(s) of y with respect to x. The method `solout` is called after each successful integration step and stops the integration whenever it is evaluated as true. The implementation of that method is optional. See the examples for implementation details.\n\n\n\n## Method selection\n\nThe following explicit Runge-Kutta methods are implemented in the current version of the crate:\n\n| Method         | Name   | Order | Error estimate order | Dense output order |\n| -------------- | ------ | ----- | -------------------- | ------------------ |\n| Runge-Kutta 4  | Rk4    | 4     | N/A                  | N/A                |\n| Dormand-Prince | Dopri5 | 5     | 4                    | 4                  |\n| Dormand-Prince | Dop853 | 8     | (5, 3)               | 7                  |\n\nThese methods are defined in the modules rk4, dopri5, and dop853. The first step is to bring the desired module into scope:\n\n```rust\nuse ode_solvers::dopri5::*;\n```\n\nThen, a structure is created using the `new` or the `from_param` method of the corresponding struct. Refer to the [API documentation](https://docs.rs/ode_solvers) for a description of the input arguments.\n\n```rust\nlet mut stepper = Dopri5::new(system, x0, x_end, dx, y0, rtol, atol);\n```\n\nThe system is integrated using\n\n```rust\nlet res = stepper.integrate();\n```\n\nand the results are retrieved with\n\n```rust\nlet x_out = stepper.x_out();\nlet y_out = stepper.y_out();\n```\n\n## Continuous Output Model\nA continuous output model can be built when solving a system with Dopri5\n```rust\nlet mut stepper = Dopri5::new(system, x0, x_end, dx, y0, rtol, atol);\nlet mut continuous_output_model = ContinuousOutputModel::default();\nlet res = stepper.integrate_with_continuous_output_model(\u0026mut continuous_output_model);\n```\nThe continuous output model can then be used to evaluate the solution at any point in the integration interval by calling the `evaluate(x: T)` method\n```rust\nlet value = continuous_output_model.evaluate(1.2);\n```\nThis method returns an `Option\u003cState\u003e` which is `None` if the interrogation point is outside the integration interval. The continuous output model is serializable which allows it to be saved and loaded independently of the system definition and integration process.\n\nSee the [homepage](https://srenevey.github.io/ode-solvers/) for more details.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrenevey%2Fode-solvers","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsrenevey%2Fode-solvers","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrenevey%2Fode-solvers/lists"}