From b24723467e274f5df9c1fed1e3b411cef1f5e582 Mon Sep 17 00:00:00 2001 From: Vitor Hideyoshi Date: Thu, 8 Dec 2022 05:30:17 -0300 Subject: [PATCH] Initial Refactoring of yoshi_otter and Test Implementation --- .gitignore | 4 + Older Versions/yoshi-otter1.2.tar.gz | Bin 29940 -> 0 bytes Older Versions/yoshi-otter1.2/LICENSE | 278 ---------- Older Versions/yoshi-otter1.2/Otter/Otter.py | 499 ----------------- .../yoshi-otter1.2/Otter/__init__.py | 21 - Older Versions/yoshi-otter1.2/README.md | 75 --- .../yoshi-otter1.2/build/lib/Otter/Otter.py | 480 ---------------- .../build/lib/Otter/__init__.py | 2 - .../dist/yoshi-otter-1.1.tar.gz | Bin 4975 -> 0 bytes .../dist/yoshi_otter-1.1-py3-none-any.whl | Bin 12205 -> 0 bytes Older Versions/yoshi-otter1.2/setup.py | 28 - .../yoshi_otter.egg-info/PKG-INFO | 91 --- .../yoshi_otter.egg-info/SOURCES.txt | 9 - .../yoshi_otter.egg-info/dependency_links.txt | 1 - .../yoshi_otter.egg-info/requires.txt | 3 - .../yoshi_otter.egg-info/top_level.txt | 1 - Older Versions/yoshi-otter1.3.1.tar.gz | Bin 31953 -> 0 bytes Older Versions/yoshi-otter1.3.1/LICENSE | 278 ---------- .../yoshi-otter1.3.1/Otter/Otter.py | 517 ------------------ .../yoshi-otter1.3.1/Otter/__init__.py | 21 - Older Versions/yoshi-otter1.3.1/README.md | 75 --- .../yoshi-otter1.3.1/build/lib/Otter/Otter.py | 517 ------------------ .../dist/yoshi-otter-1.3.1.tar.gz | Bin 5620 -> 0 bytes .../dist/yoshi-otter-1.3.tar.gz | Bin 5508 -> 0 bytes .../dist/yoshi_otter-1.3-py3-none-any.whl | Bin 12212 -> 0 bytes .../dist/yoshi_otter-1.3.1-py3-none-any.whl | Bin 12336 -> 0 bytes Older Versions/yoshi-otter1.3.1/setup.py | 28 - .../yoshi_otter.egg-info/PKG-INFO | 91 --- .../yoshi_otter.egg-info/SOURCES.txt | 9 - .../yoshi_otter.egg-info/dependency_links.txt | 1 - .../yoshi_otter.egg-info/requires.txt | 3 - .../yoshi_otter.egg-info/top_level.txt | 1 - Older Versions/yoshi-otter1.3.2.tar.xz | Bin 27960 -> 0 bytes Older Versions/yoshi-otter1.3.2/LICENSE | 278 ---------- .../yoshi-otter1.3.2/Otter/Otter.py | 517 ------------------ .../yoshi-otter1.3.2/Otter/__init__.py | 21 - Older Versions/yoshi-otter1.3.2/README.md | 75 --- .../yoshi-otter1.3.2/build/lib/Otter/Otter.py | 517 ------------------ .../build/lib/Otter/__init__.py | 21 - .../dist/yoshi-otter-1.3.2.tar.gz | Bin 5610 -> 0 bytes .../dist/yoshi_otter-1.3.2-py3-none-any.whl | Bin 12333 -> 0 bytes Older Versions/yoshi-otter1.3.2/setup.py | 28 - .../yoshi_otter.egg-info/PKG-INFO | 91 --- .../yoshi_otter.egg-info/SOURCES.txt | 9 - .../yoshi_otter.egg-info/dependency_links.txt | 1 - .../yoshi_otter.egg-info/requires.txt | 3 - .../yoshi_otter.egg-info/top_level.txt | 1 - Older Versions/yoshi-otter1.3.tar.gz | Bin 29955 -> 0 bytes Older Versions/yoshi-otter1.3/LICENSE | 278 ---------- Older Versions/yoshi-otter1.3/Otter/Otter.py | 499 ----------------- .../yoshi-otter1.3/Otter/__init__.py | 21 - Older Versions/yoshi-otter1.3/README.md | 75 --- .../yoshi-otter1.3/build/lib/Otter/Otter.py | 499 ----------------- .../build/lib/Otter/__init__.py | 21 - .../dist/yoshi-otter-1.3.tar.gz | Bin 5508 -> 0 bytes .../dist/yoshi_otter-1.3-py3-none-any.whl | Bin 12212 -> 0 bytes Older Versions/yoshi-otter1.3/setup.py | 28 - .../yoshi_otter.egg-info/PKG-INFO | 91 --- .../yoshi_otter.egg-info/SOURCES.txt | 9 - .../yoshi_otter.egg-info/dependency_links.txt | 1 - .../yoshi_otter.egg-info/requires.txt | 3 - .../yoshi_otter.egg-info/top_level.txt | 1 - Pipfile | 16 + Pipfile.lock | 241 ++++++++ Source Code - Otter/Otter.py | 515 ----------------- Source Code - Otter/__init__.py | 21 - yoshi-otter1.3.3/setup.py => setup.py | 2 +- tests/__init__.py | 0 tests/algebra/__init__.py | 0 tests/algebra/edo/__init__.py | 0 tests/algebra/edo/test_edo.py | 38 ++ tests/algebra/integral/__init__.py | 0 .../algebra/integral/test_integral_double.py | 35 ++ .../algebra/integral/test_integral_simple.py | 35 ++ tests/algebra/roots/__init__.py | 0 tests/algebra/roots/test_roots.py | 38 ++ tests/algebra/test_algebra.py | 37 ++ tests/interpolation/__init__.py | 0 tests/interpolation/test_interpolation.py | 67 +++ yoshi-otter1.3.3/LICENSE | 278 ---------- yoshi-otter1.3.3/Otter/Otter.py | 515 ----------------- yoshi-otter1.3.3/Otter/__init__.py | 21 - yoshi-otter1.3.3/README.md | 75 --- yoshi-otter1.3.3/build/lib/Otter/Otter.py | 515 ----------------- yoshi-otter1.3.3/build/lib/Otter/__init__.py | 21 - .../dist/yoshi-otter-1.3.3.tar.gz | Bin 5813 -> 0 bytes .../dist/yoshi_otter-1.3.3-py3-none-any.whl | Bin 12333 -> 0 bytes .../yoshi_otter.egg-info/PKG-INFO | 91 --- .../yoshi_otter.egg-info/SOURCES.txt | 9 - .../yoshi_otter.egg-info/dependency_links.txt | 1 - .../yoshi_otter.egg-info/requires.txt | 3 - .../yoshi_otter.egg-info/top_level.txt | 1 - .../lib/Otter => yoshi_otter}/__init__.py | 4 +- yoshi_otter/algebra/__algebra.py | 52 ++ yoshi_otter/algebra/__init__.py | 1 + yoshi_otter/algebra/edo/__edo.py | 51 ++ yoshi_otter/algebra/edo/__init__.py | 1 + yoshi_otter/algebra/integral/__init__.py | 0 yoshi_otter/algebra/integral/double.py | 79 +++ yoshi_otter/algebra/integral/simple.py | 44 ++ yoshi_otter/algebra/roots/__init__.py | 1 + yoshi_otter/algebra/roots/__roots.py | 80 +++ yoshi_otter/interpolation/__init__.py | 1 + yoshi_otter/interpolation/__interpolation.py | 183 +++++++ yoshi_otter/shared/__init__.py | 1 + .../shared/invalid_function_signature.py | 2 + 106 files changed, 1010 insertions(+), 8186 deletions(-) create mode 100644 .gitignore delete mode 100644 Older Versions/yoshi-otter1.2.tar.gz delete mode 100644 Older Versions/yoshi-otter1.2/LICENSE delete mode 100755 Older Versions/yoshi-otter1.2/Otter/Otter.py delete mode 100644 Older Versions/yoshi-otter1.2/Otter/__init__.py delete mode 100644 Older Versions/yoshi-otter1.2/README.md delete mode 100644 Older Versions/yoshi-otter1.2/build/lib/Otter/Otter.py delete mode 100644 Older Versions/yoshi-otter1.2/build/lib/Otter/__init__.py delete mode 100644 Older Versions/yoshi-otter1.2/dist/yoshi-otter-1.1.tar.gz delete mode 100644 Older Versions/yoshi-otter1.2/dist/yoshi_otter-1.1-py3-none-any.whl delete mode 100644 Older Versions/yoshi-otter1.2/setup.py delete mode 100644 Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/PKG-INFO delete mode 100644 Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/SOURCES.txt delete mode 100644 Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/dependency_links.txt delete mode 100644 Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/requires.txt delete mode 100644 Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/top_level.txt delete mode 100644 Older Versions/yoshi-otter1.3.1.tar.gz delete mode 100644 Older Versions/yoshi-otter1.3.1/LICENSE delete mode 100755 Older Versions/yoshi-otter1.3.1/Otter/Otter.py delete mode 100644 Older Versions/yoshi-otter1.3.1/Otter/__init__.py delete mode 100644 Older Versions/yoshi-otter1.3.1/README.md delete mode 100644 Older Versions/yoshi-otter1.3.1/build/lib/Otter/Otter.py delete mode 100644 Older Versions/yoshi-otter1.3.1/dist/yoshi-otter-1.3.1.tar.gz delete mode 100644 Older Versions/yoshi-otter1.3.1/dist/yoshi-otter-1.3.tar.gz delete mode 100644 Older Versions/yoshi-otter1.3.1/dist/yoshi_otter-1.3-py3-none-any.whl delete mode 100644 Older Versions/yoshi-otter1.3.1/dist/yoshi_otter-1.3.1-py3-none-any.whl delete mode 100644 Older Versions/yoshi-otter1.3.1/setup.py delete mode 100644 Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/PKG-INFO delete mode 100644 Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/SOURCES.txt delete mode 100644 Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/dependency_links.txt delete mode 100644 Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/requires.txt delete mode 100644 Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/top_level.txt delete mode 100644 Older Versions/yoshi-otter1.3.2.tar.xz delete mode 100644 Older Versions/yoshi-otter1.3.2/LICENSE delete mode 100755 Older Versions/yoshi-otter1.3.2/Otter/Otter.py delete mode 100644 Older Versions/yoshi-otter1.3.2/Otter/__init__.py delete mode 100644 Older Versions/yoshi-otter1.3.2/README.md delete mode 100644 Older Versions/yoshi-otter1.3.2/build/lib/Otter/Otter.py delete mode 100644 Older Versions/yoshi-otter1.3.2/build/lib/Otter/__init__.py delete mode 100644 Older Versions/yoshi-otter1.3.2/dist/yoshi-otter-1.3.2.tar.gz delete mode 100644 Older Versions/yoshi-otter1.3.2/dist/yoshi_otter-1.3.2-py3-none-any.whl delete mode 100644 Older Versions/yoshi-otter1.3.2/setup.py delete mode 100644 Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/PKG-INFO delete mode 100644 Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/SOURCES.txt delete mode 100644 Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/dependency_links.txt delete mode 100644 Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/requires.txt delete mode 100644 Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/top_level.txt delete mode 100644 Older Versions/yoshi-otter1.3.tar.gz delete mode 100644 Older Versions/yoshi-otter1.3/LICENSE delete mode 100755 Older Versions/yoshi-otter1.3/Otter/Otter.py delete mode 100644 Older Versions/yoshi-otter1.3/Otter/__init__.py delete mode 100644 Older Versions/yoshi-otter1.3/README.md delete mode 100644 Older Versions/yoshi-otter1.3/build/lib/Otter/Otter.py delete mode 100644 Older Versions/yoshi-otter1.3/build/lib/Otter/__init__.py delete mode 100644 Older Versions/yoshi-otter1.3/dist/yoshi-otter-1.3.tar.gz delete mode 100644 Older Versions/yoshi-otter1.3/dist/yoshi_otter-1.3-py3-none-any.whl delete mode 100644 Older Versions/yoshi-otter1.3/setup.py delete mode 100644 Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/PKG-INFO delete mode 100644 Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/SOURCES.txt delete mode 100644 Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/dependency_links.txt delete mode 100644 Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/requires.txt delete mode 100644 Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/top_level.txt create mode 100644 Pipfile create mode 100644 Pipfile.lock delete mode 100755 Source Code - Otter/Otter.py delete mode 100644 Source Code - Otter/__init__.py rename yoshi-otter1.3.3/setup.py => setup.py (94%) create mode 100644 tests/__init__.py create mode 100644 tests/algebra/__init__.py create mode 100644 tests/algebra/edo/__init__.py create mode 100644 tests/algebra/edo/test_edo.py create mode 100644 tests/algebra/integral/__init__.py create mode 100644 tests/algebra/integral/test_integral_double.py create mode 100644 tests/algebra/integral/test_integral_simple.py create mode 100644 tests/algebra/roots/__init__.py create mode 100644 tests/algebra/roots/test_roots.py create mode 100644 tests/algebra/test_algebra.py create mode 100644 tests/interpolation/__init__.py create mode 100644 tests/interpolation/test_interpolation.py delete mode 100644 yoshi-otter1.3.3/LICENSE delete mode 100755 yoshi-otter1.3.3/Otter/Otter.py delete mode 100644 yoshi-otter1.3.3/Otter/__init__.py delete mode 100644 yoshi-otter1.3.3/README.md delete mode 100644 yoshi-otter1.3.3/build/lib/Otter/Otter.py delete mode 100644 yoshi-otter1.3.3/build/lib/Otter/__init__.py delete mode 100644 yoshi-otter1.3.3/dist/yoshi-otter-1.3.3.tar.gz delete mode 100644 yoshi-otter1.3.3/dist/yoshi_otter-1.3.3-py3-none-any.whl delete mode 100644 yoshi-otter1.3.3/yoshi_otter.egg-info/PKG-INFO delete mode 100644 yoshi-otter1.3.3/yoshi_otter.egg-info/SOURCES.txt delete mode 100644 yoshi-otter1.3.3/yoshi_otter.egg-info/dependency_links.txt delete mode 100644 yoshi-otter1.3.3/yoshi_otter.egg-info/requires.txt delete mode 100644 yoshi-otter1.3.3/yoshi_otter.egg-info/top_level.txt rename {Older Versions/yoshi-otter1.3.1/build/lib/Otter => yoshi_otter}/__init__.py (90%) create mode 100644 yoshi_otter/algebra/__algebra.py create mode 100644 yoshi_otter/algebra/__init__.py create mode 100644 yoshi_otter/algebra/edo/__edo.py create mode 100644 yoshi_otter/algebra/edo/__init__.py create mode 100644 yoshi_otter/algebra/integral/__init__.py create mode 100644 yoshi_otter/algebra/integral/double.py create mode 100644 yoshi_otter/algebra/integral/simple.py create mode 100644 yoshi_otter/algebra/roots/__init__.py create mode 100644 yoshi_otter/algebra/roots/__roots.py create mode 100644 yoshi_otter/interpolation/__init__.py create mode 100644 yoshi_otter/interpolation/__interpolation.py create mode 100644 yoshi_otter/shared/__init__.py create mode 100644 yoshi_otter/shared/invalid_function_signature.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0119961 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ + +.idea/ + +*.pyc diff --git a/Older Versions/yoshi-otter1.2.tar.gz b/Older Versions/yoshi-otter1.2.tar.gz deleted file mode 100644 index d743ea50371dab94698dfdbb6315a60e3e8c4339..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29940 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 D)_tEo diff --git a/Older Versions/yoshi-otter1.2/LICENSE b/Older Versions/yoshi-otter1.2/LICENSE deleted file mode 100644 index d2c5abe..0000000 --- a/Older Versions/yoshi-otter1.2/LICENSE +++ /dev/null @@ -1,278 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.2/Otter/Otter.py b/Older Versions/yoshi-otter1.2/Otter/Otter.py deleted file mode 100755 index 0412302..0000000 --- a/Older Versions/yoshi-otter1.2/Otter/Otter.py +++ /dev/null @@ -1,499 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. -# -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -import math -import numpy as np -import Seals - -sl = Seals.method() - -class Algebra: - - def __init__(self, function): - self.f = function - self.integral = self.Integral(self.f) - self.roots = self.Roots(self.f) - self.edo = self.Edo(self.f) - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - class Integral: - - def __init__(self,function): - self.f = function - self.simple = self.Simple(function) - self.double = self.Double(function) - - class Simple: - def __init__(self, function): - self.f = function - - def riemann(self,a,b,n=None): - - if n is None: - n = 10**6 - - delta = (b-a)/n - - psi = a - theta = 0 - - while((psi+delta) <= b): - - theta += (self.f(psi) + self.f(psi + delta))/2 - psi += delta - - integral = delta*theta - - return integral - - def simpson(self,a,b,n=None): - - if n is None: - n = 10**6 - - def x(i): - return a + i*h - - h = (b-a)/n - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta = eta + self.f(x(2*psi - 1)) - psi = psi + 1 - - while(kappa <= ((n/2)-1)): - - theta = theta + self.f(x(2*kappa)) - kappa = kappa + 1 - - return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) - - - class Double: - - def __init__(self,function): - self.f = function - - def riemann(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - kappa = a - psi = c - theta = 0 - - while((psi + dy) < d): - - while((kappa + dx) < b): - - theta = theta + self.f(kappa, psi) - kappa = kappa + dx - - psi = psi + dy - kappa = a - - return theta*(dx)*(dy) - - def simpson(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - - def x(i): - - x = a + i*dx - - return x - - def y(i): - - y = c + i*dy - - return y - - def g(i): - - sigma = 0 - upsilon = 0 - - zeta = 1 - csi = 1 - - while(zeta <= (m/2)): - - sigma += self.f(x(i),y(2*zeta - 1)) - zeta += 1 - - while(csi <= ((m/2)-1)): - - upsilon += self.f(x(i),y(2*csi)) - csi += 1 - - return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta += g(2*psi - 1) - psi += 1 - - while(kappa <= ((n/2)-1)): - - theta += g(2*kappa) - kappa += 1 - - return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) - - class Roots: - - def __init__(self, function=None): - if function is not None: - self.f = function - - def bissec(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - while abs(a-b) > e: - - c = (a+b)/2 - fc = self.f(c) - - if (fa*fc) < 0: - - b = c - - else: - - a = c - fa = fc - - c = (a+b)/2 - - return c - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - def newton(self,a,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - da = self.d(a,e) - b = a - fa/da - - - while abs(a-b) > e: - - b = a - a -= (fa/da) - fa = self.f(a) - da = self.d(a,e) - - return a - - def bissec_newton(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - c = (a+b)/2 # 'c' é a raiz calculada - - while abs(a-b) > 0.1: - - fc = self.f(c) - - if fa*fc < 0: - - b = c - - else: - - a = c - fa = self.f(a) - - c = (a+b)/2 - - fc = self.f(c) - dc = self.d(c,e) - h = c - fc/dc # 'h' é uma variável de controle - - while abs(c-h) > e: - - h = c - c -= (fc/dc) - fc = self.f(c) - dc = self.d(c,e) - - return (c) - - - class Edo: - - def __init__(self, function): - self.f = function - - def euler(self,a,y,b,n=None): - - if n is None: - n = 10**7 - - dx = (b-a)/n - - def x(i): - return a + i*dx - - for i in range(n): - - y = y + (self.f(x(i),y))*dx - - return y - - def runge(self,a,y,b,n=None): - - if n is None: - n = 10**7 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - y = y + (dx/2)*(self.f(x(i),y)+self.f(x(i+1),(y+(dx*self.f(x(i),y))))) - - return y - -class Interpolation: - """ Data should be organized in two columns: X and Y""" - - def __init__(self, data): - - self.data = data - self.polinomial = self.Polinomial(self.data) - - def minimus(self,x): - - theta = 0 - # somatorio de x - for i in range(self.data.shape[0]): - - theta += self.data[i][0] - - eta = 0 - #somatorio de y - for i in range(self.data.shape[0]): - - eta += self.data[i][1] - - sigma = 0 - #somatorio de xy - for i in range(self.data.shape[0]): - - sigma += self.data[i][0]*self.data[i][1] - - omega = 0 - #somatorio de x^2 - for i in range(self.data.shape[0]): - - omega += self.data[i][0]**2 - - - self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) - - self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) - - ym = 0 - - for i in range(self.data.shape[0]): - - ym += self.data[i][1]/self.data.shape[0] - - sqreq = 0 - - for i in range(self.data.shape[0]): - - sqreq += ((self.a*self.data[i][0] + self.b) - ym)**2 - - sqtot = 0 - - for i in range(self.data.shape[0]): - - sqtot += (self.data[i][1] - ym)**2 - - self.r2 = sqreq/sqtot - - return self.a*x + self.b - - class Polinomial: - - def __init__(self, data): - self.data = data - - def vandermonde(self, x): - - matrix = np.zeros((self.data.shape[0],self.data.shape[0])) - - for k in range(0, self.data.shape[0]): - - matrix[:,k] = self.data[:,0]**k - - self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) - - y = 0 - - for i in range(0,self.A.shape[0]): - - y += self.A[i]*(x**i) - - return float(y) - - def lagrange(self, x): - - data_x = self.data[:,0] - data_y = self.data[:,1] - - def L(k,x): - - up = down = 1 - - for i in [x for x in range(data_x.shape[0]) if x != k]: - up = up*(x - data_x[i]) - - for i in [x for x in range(data_x.shape[0]) if x != k]: - down = down*(data_x[k] - data_x[i]) - - return up/down - - y = 0 - - for i in range(data_x.shape[0]): - - y += data_y[i]*L(i,x) - - return y - - def newton(self,x): - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data[:,1] - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data[(i+1)+j][0]-self.data[j][0]) - j += 1 - - i += 1 - j = 0 - - def f(x): - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data[k][0]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y - - self.f = f - - return f(x) - - def gregory(self,x): - - h = self.data[0][0] - self.data[1][0] - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data[:,1] - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) - j += 1 - - i += 1 - j = 0 - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data[k][0]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.2/Otter/__init__.py b/Older Versions/yoshi-otter1.2/Otter/__init__.py deleted file mode 100644 index 08ce1fe..0000000 --- a/Older Versions/yoshi-otter1.2/Otter/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. - -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -from .Otter import Algebra as algebra -from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.2/README.md b/Older Versions/yoshi-otter1.2/README.md deleted file mode 100644 index 05245f1..0000000 --- a/Older Versions/yoshi-otter1.2/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# Otter - Numeric Calculus - -This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: - -* Receive one variable function from user input - -* Receive two variable function from user input - -* Performe derivatives with one variable functions - -* Performe integral with received functions - -* Use methods to proccess the matrices. - -* Find root of functions throw method of bissection and method of newton - -* Solve Diferential Equations throw method of euler and runge - -* Performe Minimus Interpolation and Polinomial Interpolation - -## Syntax - -To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. - -To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. - -### Algebra - -Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). - -#### Integral - -To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. - -After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. - -The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. - -If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. - -#### Roots - -To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. - -The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. - -The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. - -If `e` is not defined the standart value is 10^(-6). - -#### Diferential Equations - -To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. - -The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. - -If `n` is not defined the standart value is 10^7. - -### Interpolation - -The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. - -To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. - -To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. - -## Installation - -To install the package from source `cd` into the directory and run: - -`pip install .` - -or run - -`pip install yoshi-otter` diff --git a/Older Versions/yoshi-otter1.2/build/lib/Otter/Otter.py b/Older Versions/yoshi-otter1.2/build/lib/Otter/Otter.py deleted file mode 100644 index c2ec3b7..0000000 --- a/Older Versions/yoshi-otter1.2/build/lib/Otter/Otter.py +++ /dev/null @@ -1,480 +0,0 @@ -import math -import numpy as np -import Seals - -sl = Seals.method() - -class Algebra: - - def __init__(self, function): - self.f = function - self.integral = self.Integral(self.f) - self.roots = self.Roots(self.f) - self.edo = self.Edo(self.f) - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - class Integral: - - def __init__(self,function): - self.f = function - self.simple = self.Simple(function) - self.double = self.Double(function) - - class Simple: - def __init__(self, function): - self.f = function - - def riemann(self,a,b,n=None): - - if n is None: - n = 10**6 - - delta = (b-a)/n - - psi = a - theta = 0 - - while((psi+delta) <= b): - - theta += (self.f(psi) + self.f(psi + delta))/2 - psi += delta - - integral = delta*theta - - return integral - - def simpson(self,a,b,n=None): - - if n is None: - n = 10**6 - - def x(i): - return a + i*h - - h = (b-a)/n - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta = eta + self.f(x(2*psi - 1)) - psi = psi + 1 - - while(kappa <= ((n/2)-1)): - - theta = theta + self.f(x(2*kappa)) - kappa = kappa + 1 - - return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) - - - class Double: - - def __init__(self,function): - self.f = function - - def riemann(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - kappa = a - psi = c - theta = 0 - - while((psi + dy) < d): - - while((kappa + dx) < b): - - theta = theta + self.f(kappa, psi) - kappa = kappa + dx - - psi = psi + dy - kappa = a - - return theta*(dx)*(dy) - - def simpson(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - - def x(i): - - x = a + i*dx - - return x - - def y(i): - - y = c + i*dy - - return y - - def g(i): - - sigma = 0 - upsilon = 0 - - zeta = 1 - csi = 1 - - while(zeta <= (m/2)): - - sigma += self.f(x(i),y(2*zeta - 1)) - zeta += 1 - - while(csi <= ((m/2)-1)): - - upsilon += self.f(x(i),y(2*csi)) - csi += 1 - - return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta += g(2*psi - 1) - psi += 1 - - while(kappa <= ((n/2)-1)): - - theta += g(2*kappa) - kappa += 1 - - return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) - - class Roots: - - def __init__(self, function=None): - if function is not None: - self.f = function - - def bissec(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - while abs(a-b) > e: - - c = (a+b)/2 - fc = self.f(c) - - if (fa*fc) < 0: - - b = c - - else: - - a = c - fa = fc - - c = (a+b)/2 - - return c - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - def newton(self,a,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - da = self.d(a,e) - b = a - fa/da - - - while abs(a-b) > e: - - b = a - a -= (fa/da) - fa = self.f(a) - da = self.d(a,e) - - return a - - def bissec_newton(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - c = (a+b)/2 # 'c' é a raiz calculada - - while abs(a-b) > 0.1: - - fc = self.f(c) - - if fa*fc < 0: - - b = c - - else: - - a = c - fa = self.f(a) - - c = (a+b)/2 - - fc = self.f(c) - dc = self.d(c,e) - h = c - fc/dc # 'h' é uma variável de controle - - while abs(c-h) > e: - - h = c - c -= (fc/dc) - fc = self.f(c) - dc = self.d(c,e) - - return (c) - - - class Edo: - - def __init__(self, function): - self.f = function - - def euler(self,a,y,b,n=None): - - if n is None: - n = 10**7 - - dx = (b-a)/n - - def x(i): - return a + i*dx - - for i in range(n): - - y = y + (self.f(x(i),y))*dx - - return y - - def runge(self,a,y,b,n=None): - - if n is None: - n = 10**7 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - y = y + (dx/2)*(self.f(x(i),y)+self.f(x(i+1),(y+(dx*self.f(x(i),y))))) - - return y - -class Interpolation: - """ Data should be organized in two columns: X and Y""" - - def __init__(self, data): - - self.data = data - self.polinomial = self.Polinomial(self.data) - - def minimus(self,x): - - theta = 0 - # somatorio de x - for i in range(self.data.shape[0]): - - theta += self.data[i][0] - - eta = 0 - #somatorio de y - for i in range(self.data.shape[0]): - - eta += self.data[i][1] - - sigma = 0 - #somatorio de xy - for i in range(self.data.shape[0]): - - sigma += self.data[i][0]*self.data[i][1] - - omega = 0 - #somatorio de x^2 - for i in range(self.data.shape[0]): - - omega += self.data[i][0]**2 - - - self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) - - self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) - - ym = 0 - - for i in range(self.data.shape[0]): - - ym += self.data[i][1]/self.data.shape[0] - - sqreq = 0 - - for i in range(self.data.shape[0]): - - sqreq += ((self.a*self.data[i][0] + self.b) - ym)**2 - - sqtot = 0 - - for i in range(self.data.shape[0]): - - sqtot += (self.data[i][1] - ym)**2 - - self.r2 = sqreq/sqtot - - return self.a*x + self.b - - class Polinomial: - - def __init__(self, data): - self.data = data - - def vandermonde(self, x): - - matrix = np.zeros((self.data.shape[0],self.data.shape[0])) - - for k in range(0, self.data.shape[0]): - - matrix[:,k] = self.data[:,0]**k - - self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) - - y = 0 - - for i in range(0,self.A.shape[0]): - - y += self.A[i]*(x**i) - - return float(y) - - def lagrange(self, x): - - data_x = self.data[:,0] - data_y = self.data[:,1] - - def L(k,x): - - up = down = 1 - - for i in [x for x in range(data_x.shape[0]) if x != k]: - up = up*(x - data_x[i]) - - for i in [x for x in range(data_x.shape[0]) if x != k]: - down = down*(data_x[k] - data_x[i]) - - return up/down - - y = 0 - - for i in range(data_x.shape[0]): - - y += data_y[i]*L(i,x) - - return y - - def newton(self,x): - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data[:,1] - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data[(i+1)+j][0]-self.data[j][0]) - j += 1 - - i += 1 - j = 0 - - def f(x): - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data[k][0]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y - - self.f = f - - return f(x) - - def gregory(self,x): - - h = self.data[0][0] - self.data[1][0] - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data[:,1] - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) - j += 1 - - i += 1 - j = 0 - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data[k][0]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.2/build/lib/Otter/__init__.py b/Older Versions/yoshi-otter1.2/build/lib/Otter/__init__.py deleted file mode 100644 index 4132067..0000000 --- a/Older Versions/yoshi-otter1.2/build/lib/Otter/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .Otter import Algebra as algebra -from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.2/dist/yoshi-otter-1.1.tar.gz b/Older Versions/yoshi-otter1.2/dist/yoshi-otter-1.1.tar.gz deleted file mode 100644 index 8d832a9809ae951ec127976b8c73fe3e465ee99f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4975 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 diff --git a/Older Versions/yoshi-otter1.2/setup.py b/Older Versions/yoshi-otter1.2/setup.py deleted file mode 100644 index 6e4ad41..0000000 --- a/Older Versions/yoshi-otter1.2/setup.py +++ /dev/null @@ -1,28 +0,0 @@ -import setuptools - -with open("README.md", "r") as fh: - long_description = fh.read() - -setuptools.setup( - name="yoshi-otter", # Replace with your own username - version="1.2", - author="Vitor Hideyoshi", - author_email="vitor.h.n.batista@gmail.com", - description="Numeric Calculus python module in the topic of Algebra Functions", - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git", - packages=setuptools.find_packages(), - classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", - "Operating System :: OS Independent", - "Development Status :: 2 - Pre-Alpha", - ], - python_requires='>=3.6', - install_requires=[ - 'numpy', - 'pandas', - 'yoshi-seals' - ], -) \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/PKG-INFO b/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/PKG-INFO deleted file mode 100644 index b2d399e..0000000 --- a/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/PKG-INFO +++ /dev/null @@ -1,91 +0,0 @@ -Metadata-Version: 2.1 -Name: yoshi-otter -Version: 1.1 -Summary: Numeric Calculus python module in the topic of Algebra Functions -Home-page: https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git -Author: Vitor Hideyoshi -Author-email: vitor.h.n.batista@gmail.com -License: UNKNOWN -Description: # Otter - Numeric Calculus - - This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: - - * Receive one variable function from user input - - * Receive two variable function from user input - - * Performe derivatives with one variable functions - - * Performe integral with received functions - - * Use methods to proccess the matrices. - - * Find root of functions throw method of bissection and method of newton - - * Solve Diferential Equations throw method of euler and runge - - * Performe Minimus Interpolation and Polinomial Interpolation - - ## Syntax - - To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. - - To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. - - ### Algebra - - Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). - - #### Integral - - To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. - - After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. - - The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. - - If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. - - #### Roots - - To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. - - The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. - - The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. - - If `e` is not defined the standart value is 10^(-6). - - #### Diferential Equations - - To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. - - The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. - - If `n` is not defined the standart value is 10^7. - - ### Interpolation - - The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. - - To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. - - To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. - - ## Installation - - To install the package from source `cd` into the directory and run: - - `pip install .` - - or run - - `pip install otter` - -Platform: UNKNOWN -Classifier: Programming Language :: Python :: 3 -Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2) -Classifier: Operating System :: OS Independent -Classifier: Development Status :: 2 - Pre-Alpha -Requires-Python: >=3.6 -Description-Content-Type: text/markdown diff --git a/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/SOURCES.txt b/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/SOURCES.txt deleted file mode 100644 index 5dc205c..0000000 --- a/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/SOURCES.txt +++ /dev/null @@ -1,9 +0,0 @@ -README.md -setup.py -Otter/Otter.py -Otter/__init__.py -yoshi_otter.egg-info/PKG-INFO -yoshi_otter.egg-info/SOURCES.txt -yoshi_otter.egg-info/dependency_links.txt -yoshi_otter.egg-info/requires.txt -yoshi_otter.egg-info/top_level.txt \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/dependency_links.txt b/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/requires.txt b/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/requires.txt deleted file mode 100644 index 11c1c26..0000000 --- a/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/requires.txt +++ /dev/null @@ -1,3 +0,0 @@ -numpy -pandas -yoshi-seals diff --git a/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/top_level.txt b/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/top_level.txt deleted file mode 100644 index ccaaf54..0000000 --- a/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -Otter diff --git a/Older Versions/yoshi-otter1.3.1.tar.gz b/Older Versions/yoshi-otter1.3.1.tar.gz deleted file mode 100644 index 5f228f442d6fead6a919273fc9c10c055af060c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31953 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 e: - - c = (a+b)/2 - fc = self.f(c) - - if (fa*fc) < 0: - - b = c - - else: - - a = c - fa = fc - - c = (a+b)/2 - - return c - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - def newton(self,a,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - da = self.d(a,e) - b = a - fa/da - - - while abs(a-b) > e: - - b = a - a -= (fa/da) - fa = self.f(a) - da = self.d(a,e) - - return a - - def bissec_newton(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - c = (a+b)/2 # 'c' é a raiz calculada - - while abs(a-b) > 0.1: - - fc = self.f(c) - - if fa*fc < 0: - - b = c - - else: - - a = c - fa = self.f(a) - - c = (a+b)/2 - - fc = self.f(c) - dc = self.d(c,e) - h = c - fc/dc # 'h' é uma variável de controle - - while abs(c-h) > e: - - h = c - c -= (fc/dc) - fc = self.f(c) - dc = self.d(c,e) - - return (c) - - - class Edo: - - def __init__(self, function): - self.F = function - - def euler(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return a + i*dx - - for i in range(n): - - y = y + (self.F(x(i),y))*dx - - return y - - def runge(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) - - return y - - def adams(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - f0 = self.F(x(i),y) - f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) - f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) - - y += (dx/12)*(5*f2 + 8*f1 - f0) - - return y - -class Interpolation: - """ Data should be organized in two columns: X and Y""" - - def __init__(self, data): - - self.data = data - self.polinomial = self.Polinomial(self.data) - - def minimus(self,x): - - theta = 0 - # somatorio de x - for i in range(self.data.shape[0]): - - theta += self.data.x[i] - - eta = 0 - #somatorio de y - for i in range(self.data.shape[0]): - - eta += self.data.y[i] - - sigma = 0 - #somatorio de xy - for i in range(self.data.shape[0]): - - sigma += self.data.x[i]*self.data.y[i] - - omega = 0 - #somatorio de x^2self.dself.dself.d - for i in range(self.data.shape[0]): - - omega += self.data.x[i]**2 - - - self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) - - self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) - - ym = 0 - - for i in range(self.data.shape[0]): - - ym += self.data.y[i]/self.data.shape[0] - - sqreq = 0 - - for i in range(self.data.shape[0]): - - sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 - - sqtot = 0 - - for i in range(self.data.shape[0]): - - sqtot += (self.data.y[i] - ym)**2 - - self.r2 = sqreq/sqtot - - return self.a*x + self.b - - class Polinomial: - - def __init__(self, data): - self.data = data - - def vandermonde(self, x): - - matrix = np.zeros((self.data.shape[0],self.data.shape[0])) - - for k in range(0, self.data.shape[0]): - - matrix[:,k] = self.data.x[:]**k - - self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) - - y = 0 - - for i in range(0,self.A.shape[0]): - - y += self.A[i]*(x**i) - - return float(y) - - def lagrange(self, x): - - def L(k,x): - - up = down = 1 - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - up = up*(x - self.data.x[i]) - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - down = down*(self.data.x[k] - self.data.x[i]) - - return up/down - - y = 0 - - for i in range(self.data.x.shape[0]): - - y += self.data.y[i]*L(i,x) - - return y - - def newton(self,x): - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) - j += 1 - - i += 1 - j = 0 - - def f(x): - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y - - self.f = f - - return f(x) - - def gregory(self,x): - - h = self.data.x[0] - self.data.x[1] - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) - j += 1 - - i += 1 - j = 0 - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.1/Otter/__init__.py b/Older Versions/yoshi-otter1.3.1/Otter/__init__.py deleted file mode 100644 index 08ce1fe..0000000 --- a/Older Versions/yoshi-otter1.3.1/Otter/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. - -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -from .Otter import Algebra as algebra -from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.1/README.md b/Older Versions/yoshi-otter1.3.1/README.md deleted file mode 100644 index 167eb4e..0000000 --- a/Older Versions/yoshi-otter1.3.1/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# Otter - Numeric Calculus - -This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: - -* Receive one variable function from user input - -* Receive two variable function from user input - -* Performe derivatives with one variable functions - -* Performe integral with received functions - -* Use methods to proccess the matrices. - -* Find root of functions throw method of bissection and method of newton - -* Solve Diferential Equations throw method of euler and runge - -* Performe Minimus Interpolation and Polinomial Interpolation - -## Syntax - -To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. - -To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. - -### Algebra - -Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). - -#### Integral - -To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. - -After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. - -The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. - -If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. - -#### Roots - -To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. - -The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. - -The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. - -If `e` is not defined the standart value is 10^(-6). - -#### Diferential Equations - -To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. - -The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. - -If `n` is not defined the standart value is 10^7. - -### Interpolation - -The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. - -To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `data` is a data frame containing values for *x* and *y*, `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. - -To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. - -## Installation - -To install the package from source `cd` into the directory and run: - -`pip install .` - -or run - -`pip install yoshi-otter` diff --git a/Older Versions/yoshi-otter1.3.1/build/lib/Otter/Otter.py b/Older Versions/yoshi-otter1.3.1/build/lib/Otter/Otter.py deleted file mode 100644 index 0e246e5..0000000 --- a/Older Versions/yoshi-otter1.3.1/build/lib/Otter/Otter.py +++ /dev/null @@ -1,517 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. -# -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -import math -import numpy as np -import pandas as pd -import Seals - -sl = Seals.process() - -class Algebra: - - def __init__(self, function): - self.f = function - self.integral = self.Integral(self.f) - self.roots = self.Roots(self.f) - self.edo = self.Edo(self.f) - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - class Integral: - - def __init__(self,function): - self.f = function - self.simple = self.Simple(function) - self.double = self.Double(function) - - class Simple: - def __init__(self, function): - self.f = function - - def riemann(self,a,b,n=None): - - if n is None: - n = 10**6 - - delta = (b-a)/n - - psi = a - theta = 0 - - while((psi+delta) <= b): - - theta += (self.f(psi) + self.f(psi + delta))/2 - psi += delta - - integral = delta*theta - - return integral - - def simpson(self,a,b,n=None): - - if n is None: - n = 10**6 - - def x(i): - return a + i*h - - h = (b-a)/n - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta = eta + self.f(x(2*psi - 1)) - psi = psi + 1 - - while(kappa <= ((n/2)-1)): - - theta = theta + self.f(x(2*kappa)) - kappa = kappa + 1 - - return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) - - - class Double: - - def __init__(self,function): - self.f = function - - def riemann(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - kappa = a - psi = c - theta = 0 - - while((psi + dy) < d): - - while((kappa + dx) < b): - - theta = theta + self.f(kappa, psi) - kappa = kappa + dx - - psi = psi + dy - kappa = a - - return theta*(dx)*(dy) - - def simpson(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - - def x(i): - - x = a + i*dx - - return x - - def y(i): - - y = c + i*dy - - return y - - def g(i): - - sigma = 0 - upsilon = 0 - - zeta = 1 - csi = 1 - - while(zeta <= (m/2)): - - sigma += self.f(x(i),y(2*zeta - 1)) - zeta += 1 - - while(csi <= ((m/2)-1)): - - upsilon += self.f(x(i),y(2*csi)) - csi += 1 - - return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta += g(2*psi - 1) - psi += 1 - - while(kappa <= ((n/2)-1)): - - theta += g(2*kappa) - kappa += 1 - - return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) - - class Roots: - - def __init__(self, function=None): - if function is not None: - self.f = function - - def bissec(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - while abs(a-b) > e: - - c = (a+b)/2 - fc = self.f(c) - - if (fa*fc) < 0: - - b = c - - else: - - a = c - fa = fc - - c = (a+b)/2 - - return c - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - def newton(self,a,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - da = self.d(a,e) - b = a - fa/da - - - while abs(a-b) > e: - - b = a - a -= (fa/da) - fa = self.f(a) - da = self.d(a,e) - - return a - - def bissec_newton(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - c = (a+b)/2 # 'c' é a raiz calculada - - while abs(a-b) > 0.1: - - fc = self.f(c) - - if fa*fc < 0: - - b = c - - else: - - a = c - fa = self.f(a) - - c = (a+b)/2 - - fc = self.f(c) - dc = self.d(c,e) - h = c - fc/dc # 'h' é uma variável de controle - - while abs(c-h) > e: - - h = c - c -= (fc/dc) - fc = self.f(c) - dc = self.d(c,e) - - return (c) - - - class Edo: - - def __init__(self, function): - self.F = function - - def euler(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return a + i*dx - - for i in range(n): - - y = y + (self.F(x(i),y))*dx - - return y - - def runge(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) - - return y - - def adams(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - f0 = self.F(x(i),y) - f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) - f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) - - y += (dx/12)*(5*f2 + 8*f1 - f0) - - return y - -class Interpolation: - """ Data should be organized in two columns: X and Y""" - - def __init__(self, data): - - self.data = data - self.polinomial = self.Polinomial(self.data) - - def minimus(self,x): - - theta = 0 - # somatorio de x - for i in range(self.data.shape[0]): - - theta += self.data.x[i] - - eta = 0 - #somatorio de y - for i in range(self.data.shape[0]): - - eta += self.data.y[i] - - sigma = 0 - #somatorio de xy - for i in range(self.data.shape[0]): - - sigma += self.data.x[i]*self.data.y[i] - - omega = 0 - #somatorio de x^2self.dself.dself.d - for i in range(self.data.shape[0]): - - omega += self.data.x[i]**2 - - - self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) - - self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) - - ym = 0 - - for i in range(self.data.shape[0]): - - ym += self.data.y[i]/self.data.shape[0] - - sqreq = 0 - - for i in range(self.data.shape[0]): - - sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 - - sqtot = 0 - - for i in range(self.data.shape[0]): - - sqtot += (self.data.y[i] - ym)**2 - - self.r2 = sqreq/sqtot - - return self.a*x + self.b - - class Polinomial: - - def __init__(self, data): - self.data = data - - def vandermonde(self, x): - - matrix = np.zeros((self.data.shape[0],self.data.shape[0])) - - for k in range(0, self.data.shape[0]): - - matrix[:,k] = self.data.x[:]**k - - self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) - - y = 0 - - for i in range(0,self.A.shape[0]): - - y += self.A[i]*(x**i) - - return float(y) - - def lagrange(self, x): - - def L(k,x): - - up = down = 1 - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - up = up*(x - self.data.x[i]) - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - down = down*(self.data.x[k] - self.data.x[i]) - - return up/down - - y = 0 - - for i in range(self.data.x.shape[0]): - - y += self.data.y[i]*L(i,x) - - return y - - def newton(self,x): - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) - j += 1 - - i += 1 - j = 0 - - def f(x): - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y - - self.f = f - - return f(x) - - def gregory(self,x): - - h = self.data.x[0] - self.data.x[1] - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) - j += 1 - - i += 1 - j = 0 - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.1/dist/yoshi-otter-1.3.1.tar.gz b/Older Versions/yoshi-otter1.3.1/dist/yoshi-otter-1.3.1.tar.gz deleted file mode 100644 index d7a7c40ad935f397bc5a0f13a77d39b857ffdbf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5620 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 diff --git a/Older Versions/yoshi-otter1.3.1/dist/yoshi-otter-1.3.tar.gz b/Older Versions/yoshi-otter1.3.1/dist/yoshi-otter-1.3.tar.gz deleted file mode 100644 index e85b65b8ccce78c5e30f8cd74689e3381bc2ed3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5508 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 diff --git a/Older Versions/yoshi-otter1.3.1/dist/yoshi_otter-1.3-py3-none-any.whl b/Older Versions/yoshi-otter1.3.1/dist/yoshi_otter-1.3-py3-none-any.whl deleted file mode 100644 index 995b13054f397dfed270acc74ac73fd39fbd4111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12212 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 Sb^y%Z8{;oep_%^i_WuChdKi`f diff --git a/Older Versions/yoshi-otter1.3.1/setup.py b/Older Versions/yoshi-otter1.3.1/setup.py deleted file mode 100644 index 10d5b33..0000000 --- a/Older Versions/yoshi-otter1.3.1/setup.py +++ /dev/null @@ -1,28 +0,0 @@ -import setuptools - -with open("README.md", "r") as fh: - long_description = fh.read() - -setuptools.setup( - name="yoshi-otter", # Replace with your own username - version="1.3.1", - author="Vitor Hideyoshi", - author_email="vitor.h.n.batista@gmail.com", - description="Numeric Calculus python module in the topic of Algebra Functions", - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git", - packages=setuptools.find_packages(), - classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", - "Operating System :: OS Independent", - "Development Status :: 2 - Pre-Alpha", - ], - python_requires='>=3.6', - install_requires=[ - 'numpy', - 'pandas', - 'yoshi-seals' - ], -) \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/PKG-INFO b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/PKG-INFO deleted file mode 100644 index 455b1cc..0000000 --- a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/PKG-INFO +++ /dev/null @@ -1,91 +0,0 @@ -Metadata-Version: 2.1 -Name: yoshi-otter -Version: 1.3.1 -Summary: Numeric Calculus python module in the topic of Algebra Functions -Home-page: https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git -Author: Vitor Hideyoshi -Author-email: vitor.h.n.batista@gmail.com -License: UNKNOWN -Description: # Otter - Numeric Calculus - - This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: - - * Receive one variable function from user input - - * Receive two variable function from user input - - * Performe derivatives with one variable functions - - * Performe integral with received functions - - * Use methods to proccess the matrices. - - * Find root of functions throw method of bissection and method of newton - - * Solve Diferential Equations throw method of euler and runge - - * Performe Minimus Interpolation and Polinomial Interpolation - - ## Syntax - - To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. - - To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. - - ### Algebra - - Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). - - #### Integral - - To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. - - After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. - - The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. - - If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. - - #### Roots - - To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. - - The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. - - The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. - - If `e` is not defined the standart value is 10^(-6). - - #### Diferential Equations - - To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. - - The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. - - If `n` is not defined the standart value is 10^7. - - ### Interpolation - - The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. - - To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `data` is a data frame containing values for *x* and *y*, `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. - - To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. - - ## Installation - - To install the package from source `cd` into the directory and run: - - `pip install .` - - or run - - `pip install yoshi-otter` - -Platform: UNKNOWN -Classifier: Programming Language :: Python :: 3 -Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2) -Classifier: Operating System :: OS Independent -Classifier: Development Status :: 2 - Pre-Alpha -Requires-Python: >=3.6 -Description-Content-Type: text/markdown diff --git a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/SOURCES.txt b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/SOURCES.txt deleted file mode 100644 index 5dc205c..0000000 --- a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/SOURCES.txt +++ /dev/null @@ -1,9 +0,0 @@ -README.md -setup.py -Otter/Otter.py -Otter/__init__.py -yoshi_otter.egg-info/PKG-INFO -yoshi_otter.egg-info/SOURCES.txt -yoshi_otter.egg-info/dependency_links.txt -yoshi_otter.egg-info/requires.txt -yoshi_otter.egg-info/top_level.txt \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/dependency_links.txt b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/requires.txt b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/requires.txt deleted file mode 100644 index 11c1c26..0000000 --- a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/requires.txt +++ /dev/null @@ -1,3 +0,0 @@ -numpy -pandas -yoshi-seals diff --git a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/top_level.txt b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/top_level.txt deleted file mode 100644 index ccaaf54..0000000 --- a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -Otter diff --git a/Older Versions/yoshi-otter1.3.2.tar.xz b/Older Versions/yoshi-otter1.3.2.tar.xz deleted file mode 100644 index 71945ad0ce1b314c39d9990f711166285b0b64c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27960 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 e: - - c = (a+b)/2 - fc = self.f(c) - - if (fa*fc) < 0: - - b = c - - else: - - a = c - fa = fc - - c = (a+b)/2 - - return c - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - def newton(self,a,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - da = self.d(a,e) - b = a - fa/da - - - while abs(a-b) > e: - - b = a - a -= (fa/da) - fa = self.f(a) - da = self.d(a,e) - - return a - - def bissec_newton(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - c = (a+b)/2 # 'c' é a raiz calculada - - while abs(a-b) > 0.1: - - fc = self.f(c) - - if fa*fc < 0: - - b = c - - else: - - a = c - fa = self.f(a) - - c = (a+b)/2 - - fc = self.f(c) - dc = self.d(c,e) - h = c - fc/dc # 'h' é uma variável de controle - - while abs(c-h) > e: - - h = c - c -= (fc/dc) - fc = self.f(c) - dc = self.d(c,e) - - return (c) - - - class Edo: - - def __init__(self, function): - self.F = function - - def euler(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return a + i*dx - - for i in range(n): - - y = y + (self.F(x(i),y))*dx - - return y - - def runge(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) - - return y - - def adams(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - f0 = self.F(x(i),y) - f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) - f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) - - y += (dx/12)*(5*f2 + 8*f1 - f0) - - return y - -class Interpolation: - """ Data should be organized in two columns: X and Y""" - - def __init__(self, data): - - self.data = data - self.polinomial = self.Polinomial(self.data) - - def minimus(self,x): - - theta = 0 - # somatorio de x - for i in range(self.data.shape[0]): - - theta += self.data.x[i] - - eta = 0 - #somatorio de y - for i in range(self.data.shape[0]): - - eta += self.data.y[i] - - sigma = 0 - #somatorio de xy - for i in range(self.data.shape[0]): - - sigma += self.data.x[i]*self.data.y[i] - - omega = 0 - #somatorio de x^2self.dself.dself.d - for i in range(self.data.shape[0]): - - omega += self.data.x[i]**2 - - - self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) - - self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) - - ym = 0 - - for i in range(self.data.shape[0]): - - ym += self.data.y[i]/self.data.shape[0] - - sqreq = 0 - - for i in range(self.data.shape[0]): - - sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 - - sqtot = 0 - - for i in range(self.data.shape[0]): - - sqtot += (self.data.y[i] - ym)**2 - - self.r2 = sqreq/sqtot - - return self.a*x + self.b - - class Polinomial: - - def __init__(self, data): - self.data = data - - def vandermonde(self, x): - - matrix = np.zeros((self.data.shape[0],self.data.shape[0])) - - for k in range(0, self.data.shape[0]): - - matrix[:,k] = self.data.x[:]**k - - self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) - - y = 0 - - for i in range(0,self.A.shape[0]): - - y += self.A[i]*(x**i) - - return float(y) - - def lagrange(self, x): - - def L(k,x): - - up = down = 1 - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - up = up*(x - self.data.x[i]) - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - down = down*(self.data.x[k] - self.data.x[i]) - - return up/down - - y = 0 - - for i in range(self.data.x.shape[0]): - - y += self.data.y[i]*L(i,x) - - return y - - def newton(self,x): - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) - j += 1 - - i += 1 - j = 0 - - def f(x): - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y - - self.f = f - - return f(x) - - def gregory(self,x): - - h = self.data.x[0] - self.data.x[1] - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) - j += 1 - - i += 1 - j = 0 - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.2/Otter/__init__.py b/Older Versions/yoshi-otter1.3.2/Otter/__init__.py deleted file mode 100644 index 08ce1fe..0000000 --- a/Older Versions/yoshi-otter1.3.2/Otter/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. - -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -from .Otter import Algebra as algebra -from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.2/README.md b/Older Versions/yoshi-otter1.3.2/README.md deleted file mode 100644 index 167eb4e..0000000 --- a/Older Versions/yoshi-otter1.3.2/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# Otter - Numeric Calculus - -This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: - -* Receive one variable function from user input - -* Receive two variable function from user input - -* Performe derivatives with one variable functions - -* Performe integral with received functions - -* Use methods to proccess the matrices. - -* Find root of functions throw method of bissection and method of newton - -* Solve Diferential Equations throw method of euler and runge - -* Performe Minimus Interpolation and Polinomial Interpolation - -## Syntax - -To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. - -To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. - -### Algebra - -Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). - -#### Integral - -To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. - -After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. - -The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. - -If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. - -#### Roots - -To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. - -The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. - -The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. - -If `e` is not defined the standart value is 10^(-6). - -#### Diferential Equations - -To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. - -The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. - -If `n` is not defined the standart value is 10^7. - -### Interpolation - -The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. - -To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `data` is a data frame containing values for *x* and *y*, `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. - -To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. - -## Installation - -To install the package from source `cd` into the directory and run: - -`pip install .` - -or run - -`pip install yoshi-otter` diff --git a/Older Versions/yoshi-otter1.3.2/build/lib/Otter/Otter.py b/Older Versions/yoshi-otter1.3.2/build/lib/Otter/Otter.py deleted file mode 100644 index 967c47a..0000000 --- a/Older Versions/yoshi-otter1.3.2/build/lib/Otter/Otter.py +++ /dev/null @@ -1,517 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. -# -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -import math -import numpy as np -import pandas as pd -import Seals - -sl = Seals.process - -class Algebra: - - def __init__(self, function): - self.f = function - self.integral = self.Integral(self.f) - self.roots = self.Roots(self.f) - self.edo = self.Edo(self.f) - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - class Integral: - - def __init__(self,function): - self.f = function - self.simple = self.Simple(function) - self.double = self.Double(function) - - class Simple: - def __init__(self, function): - self.f = function - - def riemann(self,a,b,n=None): - - if n is None: - n = 10**6 - - delta = (b-a)/n - - psi = a - theta = 0 - - while((psi+delta) <= b): - - theta += (self.f(psi) + self.f(psi + delta))/2 - psi += delta - - integral = delta*theta - - return integral - - def simpson(self,a,b,n=None): - - if n is None: - n = 10**6 - - def x(i): - return a + i*h - - h = (b-a)/n - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta = eta + self.f(x(2*psi - 1)) - psi = psi + 1 - - while(kappa <= ((n/2)-1)): - - theta = theta + self.f(x(2*kappa)) - kappa = kappa + 1 - - return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) - - - class Double: - - def __init__(self,function): - self.f = function - - def riemann(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - kappa = a - psi = c - theta = 0 - - while((psi + dy) < d): - - while((kappa + dx) < b): - - theta = theta + self.f(kappa, psi) - kappa = kappa + dx - - psi = psi + dy - kappa = a - - return theta*(dx)*(dy) - - def simpson(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - - def x(i): - - x = a + i*dx - - return x - - def y(i): - - y = c + i*dy - - return y - - def g(i): - - sigma = 0 - upsilon = 0 - - zeta = 1 - csi = 1 - - while(zeta <= (m/2)): - - sigma += self.f(x(i),y(2*zeta - 1)) - zeta += 1 - - while(csi <= ((m/2)-1)): - - upsilon += self.f(x(i),y(2*csi)) - csi += 1 - - return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta += g(2*psi - 1) - psi += 1 - - while(kappa <= ((n/2)-1)): - - theta += g(2*kappa) - kappa += 1 - - return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) - - class Roots: - - def __init__(self, function=None): - if function is not None: - self.f = function - - def bissec(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - while abs(a-b) > e: - - c = (a+b)/2 - fc = self.f(c) - - if (fa*fc) < 0: - - b = c - - else: - - a = c - fa = fc - - c = (a+b)/2 - - return c - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - def newton(self,a,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - da = self.d(a,e) - b = a - fa/da - - - while abs(a-b) > e: - - b = a - a -= (fa/da) - fa = self.f(a) - da = self.d(a,e) - - return a - - def bissec_newton(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - c = (a+b)/2 # 'c' é a raiz calculada - - while abs(a-b) > 0.1: - - fc = self.f(c) - - if fa*fc < 0: - - b = c - - else: - - a = c - fa = self.f(a) - - c = (a+b)/2 - - fc = self.f(c) - dc = self.d(c,e) - h = c - fc/dc # 'h' é uma variável de controle - - while abs(c-h) > e: - - h = c - c -= (fc/dc) - fc = self.f(c) - dc = self.d(c,e) - - return (c) - - - class Edo: - - def __init__(self, function): - self.F = function - - def euler(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return a + i*dx - - for i in range(n): - - y = y + (self.F(x(i),y))*dx - - return y - - def runge(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) - - return y - - def adams(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - f0 = self.F(x(i),y) - f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) - f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) - - y += (dx/12)*(5*f2 + 8*f1 - f0) - - return y - -class Interpolation: - """ Data should be organized in two columns: X and Y""" - - def __init__(self, data): - - self.data = data - self.polinomial = self.Polinomial(self.data) - - def minimus(self,x): - - theta = 0 - # somatorio de x - for i in range(self.data.shape[0]): - - theta += self.data.x[i] - - eta = 0 - #somatorio de y - for i in range(self.data.shape[0]): - - eta += self.data.y[i] - - sigma = 0 - #somatorio de xy - for i in range(self.data.shape[0]): - - sigma += self.data.x[i]*self.data.y[i] - - omega = 0 - #somatorio de x^2self.dself.dself.d - for i in range(self.data.shape[0]): - - omega += self.data.x[i]**2 - - - self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) - - self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) - - ym = 0 - - for i in range(self.data.shape[0]): - - ym += self.data.y[i]/self.data.shape[0] - - sqreq = 0 - - for i in range(self.data.shape[0]): - - sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 - - sqtot = 0 - - for i in range(self.data.shape[0]): - - sqtot += (self.data.y[i] - ym)**2 - - self.r2 = sqreq/sqtot - - return self.a*x + self.b - - class Polinomial: - - def __init__(self, data): - self.data = data - - def vandermonde(self, x): - - matrix = np.zeros((self.data.shape[0],self.data.shape[0])) - - for k in range(0, self.data.shape[0]): - - matrix[:,k] = self.data.x[:]**k - - self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) - - y = 0 - - for i in range(0,self.A.shape[0]): - - y += self.A[i]*(x**i) - - return float(y) - - def lagrange(self, x): - - def L(k,x): - - up = down = 1 - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - up = up*(x - self.data.x[i]) - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - down = down*(self.data.x[k] - self.data.x[i]) - - return up/down - - y = 0 - - for i in range(self.data.x.shape[0]): - - y += self.data.y[i]*L(i,x) - - return y - - def newton(self,x): - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) - j += 1 - - i += 1 - j = 0 - - def f(x): - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y - - self.f = f - - return f(x) - - def gregory(self,x): - - h = self.data.x[0] - self.data.x[1] - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) - j += 1 - - i += 1 - j = 0 - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.2/build/lib/Otter/__init__.py b/Older Versions/yoshi-otter1.3.2/build/lib/Otter/__init__.py deleted file mode 100644 index 08ce1fe..0000000 --- a/Older Versions/yoshi-otter1.3.2/build/lib/Otter/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. - -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -from .Otter import Algebra as algebra -from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.2/dist/yoshi-otter-1.3.2.tar.gz b/Older Versions/yoshi-otter1.3.2/dist/yoshi-otter-1.3.2.tar.gz deleted file mode 100644 index fa873acf18f6b821eb63ff3f7ef075b6f00f1eb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5610 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 I_>Z^$13V@Yh5!Hn diff --git a/Older Versions/yoshi-otter1.3.2/setup.py b/Older Versions/yoshi-otter1.3.2/setup.py deleted file mode 100644 index c29b1e8..0000000 --- a/Older Versions/yoshi-otter1.3.2/setup.py +++ /dev/null @@ -1,28 +0,0 @@ -import setuptools - -with open("README.md", "r") as fh: - long_description = fh.read() - -setuptools.setup( - name="yoshi-otter", # Replace with your own username - version="1.3.2", - author="Vitor Hideyoshi", - author_email="vitor.h.n.batista@gmail.com", - description="Numeric Calculus python module in the topic of Algebra Functions", - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git", - packages=setuptools.find_packages(), - classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", - "Operating System :: OS Independent", - "Development Status :: 2 - Pre-Alpha", - ], - python_requires='>=3.6', - install_requires=[ - 'numpy', - 'pandas', - 'yoshi-seals' - ], -) \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/PKG-INFO b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/PKG-INFO deleted file mode 100644 index a0f9ee7..0000000 --- a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/PKG-INFO +++ /dev/null @@ -1,91 +0,0 @@ -Metadata-Version: 2.1 -Name: yoshi-otter -Version: 1.3.2 -Summary: Numeric Calculus python module in the topic of Algebra Functions -Home-page: https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git -Author: Vitor Hideyoshi -Author-email: vitor.h.n.batista@gmail.com -License: UNKNOWN -Description: # Otter - Numeric Calculus - - This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: - - * Receive one variable function from user input - - * Receive two variable function from user input - - * Performe derivatives with one variable functions - - * Performe integral with received functions - - * Use methods to proccess the matrices. - - * Find root of functions throw method of bissection and method of newton - - * Solve Diferential Equations throw method of euler and runge - - * Performe Minimus Interpolation and Polinomial Interpolation - - ## Syntax - - To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. - - To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. - - ### Algebra - - Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). - - #### Integral - - To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. - - After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. - - The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. - - If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. - - #### Roots - - To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. - - The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. - - The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. - - If `e` is not defined the standart value is 10^(-6). - - #### Diferential Equations - - To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. - - The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. - - If `n` is not defined the standart value is 10^7. - - ### Interpolation - - The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. - - To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `data` is a data frame containing values for *x* and *y*, `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. - - To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. - - ## Installation - - To install the package from source `cd` into the directory and run: - - `pip install .` - - or run - - `pip install yoshi-otter` - -Platform: UNKNOWN -Classifier: Programming Language :: Python :: 3 -Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2) -Classifier: Operating System :: OS Independent -Classifier: Development Status :: 2 - Pre-Alpha -Requires-Python: >=3.6 -Description-Content-Type: text/markdown diff --git a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/SOURCES.txt b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/SOURCES.txt deleted file mode 100644 index 5dc205c..0000000 --- a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/SOURCES.txt +++ /dev/null @@ -1,9 +0,0 @@ -README.md -setup.py -Otter/Otter.py -Otter/__init__.py -yoshi_otter.egg-info/PKG-INFO -yoshi_otter.egg-info/SOURCES.txt -yoshi_otter.egg-info/dependency_links.txt -yoshi_otter.egg-info/requires.txt -yoshi_otter.egg-info/top_level.txt \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/dependency_links.txt b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/requires.txt b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/requires.txt deleted file mode 100644 index 11c1c26..0000000 --- a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/requires.txt +++ /dev/null @@ -1,3 +0,0 @@ -numpy -pandas -yoshi-seals diff --git a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/top_level.txt b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/top_level.txt deleted file mode 100644 index ccaaf54..0000000 --- a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -Otter diff --git a/Older Versions/yoshi-otter1.3.tar.gz b/Older Versions/yoshi-otter1.3.tar.gz deleted file mode 100644 index 9996e1193983988d32f3cb09ace4d21d2dbe7450..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29955 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 SKE>yM^7((~nL-2rPyql?f*ThA diff --git a/Older Versions/yoshi-otter1.3/LICENSE b/Older Versions/yoshi-otter1.3/LICENSE deleted file mode 100644 index d2c5abe..0000000 --- a/Older Versions/yoshi-otter1.3/LICENSE +++ /dev/null @@ -1,278 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3/Otter/Otter.py b/Older Versions/yoshi-otter1.3/Otter/Otter.py deleted file mode 100755 index ae4a8cd..0000000 --- a/Older Versions/yoshi-otter1.3/Otter/Otter.py +++ /dev/null @@ -1,499 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. -# -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -import math -import numpy as np -import Seals - -sl = Seals.process() - -class Algebra: - - def __init__(self, function): - self.f = function - self.integral = self.Integral(self.f) - self.roots = self.Roots(self.f) - self.edo = self.Edo(self.f) - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - class Integral: - - def __init__(self,function): - self.f = function - self.simple = self.Simple(function) - self.double = self.Double(function) - - class Simple: - def __init__(self, function): - self.f = function - - def riemann(self,a,b,n=None): - - if n is None: - n = 10**6 - - delta = (b-a)/n - - psi = a - theta = 0 - - while((psi+delta) <= b): - - theta += (self.f(psi) + self.f(psi + delta))/2 - psi += delta - - integral = delta*theta - - return integral - - def simpson(self,a,b,n=None): - - if n is None: - n = 10**6 - - def x(i): - return a + i*h - - h = (b-a)/n - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta = eta + self.f(x(2*psi - 1)) - psi = psi + 1 - - while(kappa <= ((n/2)-1)): - - theta = theta + self.f(x(2*kappa)) - kappa = kappa + 1 - - return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) - - - class Double: - - def __init__(self,function): - self.f = function - - def riemann(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - kappa = a - psi = c - theta = 0 - - while((psi + dy) < d): - - while((kappa + dx) < b): - - theta = theta + self.f(kappa, psi) - kappa = kappa + dx - - psi = psi + dy - kappa = a - - return theta*(dx)*(dy) - - def simpson(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - - def x(i): - - x = a + i*dx - - return x - - def y(i): - - y = c + i*dy - - return y - - def g(i): - - sigma = 0 - upsilon = 0 - - zeta = 1 - csi = 1 - - while(zeta <= (m/2)): - - sigma += self.f(x(i),y(2*zeta - 1)) - zeta += 1 - - while(csi <= ((m/2)-1)): - - upsilon += self.f(x(i),y(2*csi)) - csi += 1 - - return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta += g(2*psi - 1) - psi += 1 - - while(kappa <= ((n/2)-1)): - - theta += g(2*kappa) - kappa += 1 - - return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) - - class Roots: - - def __init__(self, function=None): - if function is not None: - self.f = function - - def bissec(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - while abs(a-b) > e: - - c = (a+b)/2 - fc = self.f(c) - - if (fa*fc) < 0: - - b = c - - else: - - a = c - fa = fc - - c = (a+b)/2 - - return c - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - def newton(self,a,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - da = self.d(a,e) - b = a - fa/da - - - while abs(a-b) > e: - - b = a - a -= (fa/da) - fa = self.f(a) - da = self.d(a,e) - - return a - - def bissec_newton(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - c = (a+b)/2 # 'c' é a raiz calculada - - while abs(a-b) > 0.1: - - fc = self.f(c) - - if fa*fc < 0: - - b = c - - else: - - a = c - fa = self.f(a) - - c = (a+b)/2 - - fc = self.f(c) - dc = self.d(c,e) - h = c - fc/dc # 'h' é uma variável de controle - - while abs(c-h) > e: - - h = c - c -= (fc/dc) - fc = self.f(c) - dc = self.d(c,e) - - return (c) - - - class Edo: - - def __init__(self, function): - self.f = function - - def euler(self,a,y,b,n=None): - - if n is None: - n = 10**7 - - dx = (b-a)/n - - def x(i): - return a + i*dx - - for i in range(n): - - y = y + (self.f(x(i),y))*dx - - return y - - def runge(self,a,y,b,n=None): - - if n is None: - n = 10**7 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - y = y + (dx/2)*(self.f(x(i),y)+self.f(x(i+1),(y+(dx*self.f(x(i),y))))) - - return y - -class Interpolation: - """ Data should be organized in two columns: X and Y""" - - def __init__(self, data): - - self.data = data - self.polinomial = self.Polinomial(self.data) - - def minimus(self,x): - - theta = 0 - # somatorio de x - for i in range(self.data.shape[0]): - - theta += self.data[i][0] - - eta = 0 - #somatorio de y - for i in range(self.data.shape[0]): - - eta += self.data[i][1] - - sigma = 0 - #somatorio de xy - for i in range(self.data.shape[0]): - - sigma += self.data[i][0]*self.data[i][1] - - omega = 0 - #somatorio de x^2 - for i in range(self.data.shape[0]): - - omega += self.data[i][0]**2 - - - self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) - - self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) - - ym = 0 - - for i in range(self.data.shape[0]): - - ym += self.data[i][1]/self.data.shape[0] - - sqreq = 0 - - for i in range(self.data.shape[0]): - - sqreq += ((self.a*self.data[i][0] + self.b) - ym)**2 - - sqtot = 0 - - for i in range(self.data.shape[0]): - - sqtot += (self.data[i][1] - ym)**2 - - self.r2 = sqreq/sqtot - - return self.a*x + self.b - - class Polinomial: - - def __init__(self, data): - self.data = data - - def vandermonde(self, x): - - matrix = np.zeros((self.data.shape[0],self.data.shape[0])) - - for k in range(0, self.data.shape[0]): - - matrix[:,k] = self.data[:,0]**k - - self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) - - y = 0 - - for i in range(0,self.A.shape[0]): - - y += self.A[i]*(x**i) - - return float(y) - - def lagrange(self, x): - - data_x = self.data[:,0] - data_y = self.data[:,1] - - def L(k,x): - - up = down = 1 - - for i in [x for x in range(data_x.shape[0]) if x != k]: - up = up*(x - data_x[i]) - - for i in [x for x in range(data_x.shape[0]) if x != k]: - down = down*(data_x[k] - data_x[i]) - - return up/down - - y = 0 - - for i in range(data_x.shape[0]): - - y += data_y[i]*L(i,x) - - return y - - def newton(self,x): - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data[:,1] - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data[(i+1)+j][0]-self.data[j][0]) - j += 1 - - i += 1 - j = 0 - - def f(x): - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data[k][0]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y - - self.f = f - - return f(x) - - def gregory(self,x): - - h = self.data[0][0] - self.data[1][0] - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data[:,1] - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) - j += 1 - - i += 1 - j = 0 - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data[k][0]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3/Otter/__init__.py b/Older Versions/yoshi-otter1.3/Otter/__init__.py deleted file mode 100644 index 08ce1fe..0000000 --- a/Older Versions/yoshi-otter1.3/Otter/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. - -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -from .Otter import Algebra as algebra -from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3/README.md b/Older Versions/yoshi-otter1.3/README.md deleted file mode 100644 index 05245f1..0000000 --- a/Older Versions/yoshi-otter1.3/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# Otter - Numeric Calculus - -This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: - -* Receive one variable function from user input - -* Receive two variable function from user input - -* Performe derivatives with one variable functions - -* Performe integral with received functions - -* Use methods to proccess the matrices. - -* Find root of functions throw method of bissection and method of newton - -* Solve Diferential Equations throw method of euler and runge - -* Performe Minimus Interpolation and Polinomial Interpolation - -## Syntax - -To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. - -To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. - -### Algebra - -Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). - -#### Integral - -To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. - -After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. - -The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. - -If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. - -#### Roots - -To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. - -The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. - -The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. - -If `e` is not defined the standart value is 10^(-6). - -#### Diferential Equations - -To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. - -The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. - -If `n` is not defined the standart value is 10^7. - -### Interpolation - -The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. - -To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. - -To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. - -## Installation - -To install the package from source `cd` into the directory and run: - -`pip install .` - -or run - -`pip install yoshi-otter` diff --git a/Older Versions/yoshi-otter1.3/build/lib/Otter/Otter.py b/Older Versions/yoshi-otter1.3/build/lib/Otter/Otter.py deleted file mode 100644 index ae4a8cd..0000000 --- a/Older Versions/yoshi-otter1.3/build/lib/Otter/Otter.py +++ /dev/null @@ -1,499 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. -# -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -import math -import numpy as np -import Seals - -sl = Seals.process() - -class Algebra: - - def __init__(self, function): - self.f = function - self.integral = self.Integral(self.f) - self.roots = self.Roots(self.f) - self.edo = self.Edo(self.f) - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - class Integral: - - def __init__(self,function): - self.f = function - self.simple = self.Simple(function) - self.double = self.Double(function) - - class Simple: - def __init__(self, function): - self.f = function - - def riemann(self,a,b,n=None): - - if n is None: - n = 10**6 - - delta = (b-a)/n - - psi = a - theta = 0 - - while((psi+delta) <= b): - - theta += (self.f(psi) + self.f(psi + delta))/2 - psi += delta - - integral = delta*theta - - return integral - - def simpson(self,a,b,n=None): - - if n is None: - n = 10**6 - - def x(i): - return a + i*h - - h = (b-a)/n - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta = eta + self.f(x(2*psi - 1)) - psi = psi + 1 - - while(kappa <= ((n/2)-1)): - - theta = theta + self.f(x(2*kappa)) - kappa = kappa + 1 - - return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) - - - class Double: - - def __init__(self,function): - self.f = function - - def riemann(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - kappa = a - psi = c - theta = 0 - - while((psi + dy) < d): - - while((kappa + dx) < b): - - theta = theta + self.f(kappa, psi) - kappa = kappa + dx - - psi = psi + dy - kappa = a - - return theta*(dx)*(dy) - - def simpson(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - - def x(i): - - x = a + i*dx - - return x - - def y(i): - - y = c + i*dy - - return y - - def g(i): - - sigma = 0 - upsilon = 0 - - zeta = 1 - csi = 1 - - while(zeta <= (m/2)): - - sigma += self.f(x(i),y(2*zeta - 1)) - zeta += 1 - - while(csi <= ((m/2)-1)): - - upsilon += self.f(x(i),y(2*csi)) - csi += 1 - - return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta += g(2*psi - 1) - psi += 1 - - while(kappa <= ((n/2)-1)): - - theta += g(2*kappa) - kappa += 1 - - return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) - - class Roots: - - def __init__(self, function=None): - if function is not None: - self.f = function - - def bissec(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - while abs(a-b) > e: - - c = (a+b)/2 - fc = self.f(c) - - if (fa*fc) < 0: - - b = c - - else: - - a = c - fa = fc - - c = (a+b)/2 - - return c - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - def newton(self,a,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - da = self.d(a,e) - b = a - fa/da - - - while abs(a-b) > e: - - b = a - a -= (fa/da) - fa = self.f(a) - da = self.d(a,e) - - return a - - def bissec_newton(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - c = (a+b)/2 # 'c' é a raiz calculada - - while abs(a-b) > 0.1: - - fc = self.f(c) - - if fa*fc < 0: - - b = c - - else: - - a = c - fa = self.f(a) - - c = (a+b)/2 - - fc = self.f(c) - dc = self.d(c,e) - h = c - fc/dc # 'h' é uma variável de controle - - while abs(c-h) > e: - - h = c - c -= (fc/dc) - fc = self.f(c) - dc = self.d(c,e) - - return (c) - - - class Edo: - - def __init__(self, function): - self.f = function - - def euler(self,a,y,b,n=None): - - if n is None: - n = 10**7 - - dx = (b-a)/n - - def x(i): - return a + i*dx - - for i in range(n): - - y = y + (self.f(x(i),y))*dx - - return y - - def runge(self,a,y,b,n=None): - - if n is None: - n = 10**7 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - y = y + (dx/2)*(self.f(x(i),y)+self.f(x(i+1),(y+(dx*self.f(x(i),y))))) - - return y - -class Interpolation: - """ Data should be organized in two columns: X and Y""" - - def __init__(self, data): - - self.data = data - self.polinomial = self.Polinomial(self.data) - - def minimus(self,x): - - theta = 0 - # somatorio de x - for i in range(self.data.shape[0]): - - theta += self.data[i][0] - - eta = 0 - #somatorio de y - for i in range(self.data.shape[0]): - - eta += self.data[i][1] - - sigma = 0 - #somatorio de xy - for i in range(self.data.shape[0]): - - sigma += self.data[i][0]*self.data[i][1] - - omega = 0 - #somatorio de x^2 - for i in range(self.data.shape[0]): - - omega += self.data[i][0]**2 - - - self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) - - self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) - - ym = 0 - - for i in range(self.data.shape[0]): - - ym += self.data[i][1]/self.data.shape[0] - - sqreq = 0 - - for i in range(self.data.shape[0]): - - sqreq += ((self.a*self.data[i][0] + self.b) - ym)**2 - - sqtot = 0 - - for i in range(self.data.shape[0]): - - sqtot += (self.data[i][1] - ym)**2 - - self.r2 = sqreq/sqtot - - return self.a*x + self.b - - class Polinomial: - - def __init__(self, data): - self.data = data - - def vandermonde(self, x): - - matrix = np.zeros((self.data.shape[0],self.data.shape[0])) - - for k in range(0, self.data.shape[0]): - - matrix[:,k] = self.data[:,0]**k - - self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) - - y = 0 - - for i in range(0,self.A.shape[0]): - - y += self.A[i]*(x**i) - - return float(y) - - def lagrange(self, x): - - data_x = self.data[:,0] - data_y = self.data[:,1] - - def L(k,x): - - up = down = 1 - - for i in [x for x in range(data_x.shape[0]) if x != k]: - up = up*(x - data_x[i]) - - for i in [x for x in range(data_x.shape[0]) if x != k]: - down = down*(data_x[k] - data_x[i]) - - return up/down - - y = 0 - - for i in range(data_x.shape[0]): - - y += data_y[i]*L(i,x) - - return y - - def newton(self,x): - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data[:,1] - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data[(i+1)+j][0]-self.data[j][0]) - j += 1 - - i += 1 - j = 0 - - def f(x): - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data[k][0]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y - - self.f = f - - return f(x) - - def gregory(self,x): - - h = self.data[0][0] - self.data[1][0] - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data[:,1] - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) - j += 1 - - i += 1 - j = 0 - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data[k][0]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3/build/lib/Otter/__init__.py b/Older Versions/yoshi-otter1.3/build/lib/Otter/__init__.py deleted file mode 100644 index 08ce1fe..0000000 --- a/Older Versions/yoshi-otter1.3/build/lib/Otter/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. - -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -from .Otter import Algebra as algebra -from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3/dist/yoshi-otter-1.3.tar.gz b/Older Versions/yoshi-otter1.3/dist/yoshi-otter-1.3.tar.gz deleted file mode 100644 index e85b65b8ccce78c5e30f8cd74689e3381bc2ed3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5508 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 diff --git a/Older Versions/yoshi-otter1.3/dist/yoshi_otter-1.3-py3-none-any.whl b/Older Versions/yoshi-otter1.3/dist/yoshi_otter-1.3-py3-none-any.whl deleted file mode 100644 index 995b13054f397dfed270acc74ac73fd39fbd4111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12212 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.6 -Description-Content-Type: text/markdown diff --git a/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/SOURCES.txt b/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/SOURCES.txt deleted file mode 100644 index 5dc205c..0000000 --- a/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/SOURCES.txt +++ /dev/null @@ -1,9 +0,0 @@ -README.md -setup.py -Otter/Otter.py -Otter/__init__.py -yoshi_otter.egg-info/PKG-INFO -yoshi_otter.egg-info/SOURCES.txt -yoshi_otter.egg-info/dependency_links.txt -yoshi_otter.egg-info/requires.txt -yoshi_otter.egg-info/top_level.txt \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/dependency_links.txt b/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/requires.txt b/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/requires.txt deleted file mode 100644 index 11c1c26..0000000 --- a/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/requires.txt +++ /dev/null @@ -1,3 +0,0 @@ -numpy -pandas -yoshi-seals diff --git a/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/top_level.txt b/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/top_level.txt deleted file mode 100644 index ccaaf54..0000000 --- a/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -Otter diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..9bfd426 --- /dev/null +++ b/Pipfile @@ -0,0 +1,16 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +pandas = "*" +numpy = "*" +yoshi-seals = "*" + +[dev-packages] +black = "*" +coverage = "*" + +[requires] +python_version = "3.10" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..31fd703 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,241 @@ +{ + "_meta": { + "hash": { + "sha256": "931881177d120d4c175ea11b88e6b666330e9519c0aec2dd1bd089a53e7e8694" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.10" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "numpy": { + "hashes": [ + "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d", + "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07", + "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df", + "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9", + "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d", + "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a", + "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719", + "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2", + "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280", + "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa", + "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387", + "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1", + "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43", + "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f", + "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398", + "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63", + "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de", + "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8", + "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481", + "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0", + "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d", + "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e", + "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96", + "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb", + "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6", + "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d", + "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a", + "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135" + ], + "index": "pypi", + "version": "==1.23.5" + }, + "pandas": { + "hashes": [ + "sha256:0183cb04a057cc38fde5244909fca9826d5d57c4a5b7390c0cc3fa7acd9fa883", + "sha256:1fc87eac0541a7d24648a001d553406f4256e744d92df1df8ebe41829a915028", + "sha256:220b98d15cee0b2cd839a6358bd1f273d0356bf964c1a1aeb32d47db0215488b", + "sha256:2552bffc808641c6eb471e55aa6899fa002ac94e4eebfa9ec058649122db5824", + "sha256:315e19a3e5c2ab47a67467fc0362cb36c7c60a93b6457f675d7d9615edad2ebe", + "sha256:344021ed3e639e017b452aa8f5f6bf38a8806f5852e217a7594417fb9bbfa00e", + "sha256:375262829c8c700c3e7cbb336810b94367b9c4889818bbd910d0ecb4e45dc261", + "sha256:457d8c3d42314ff47cc2d6c54f8fc0d23954b47977b2caed09cd9635cb75388b", + "sha256:4aed257c7484d01c9a194d9a94758b37d3d751849c05a0050c087a358c41ad1f", + "sha256:530948945e7b6c95e6fa7aa4be2be25764af53fba93fe76d912e35d1c9ee46f5", + "sha256:5ae7e989f12628f41e804847a8cc2943d362440132919a69429d4dea1f164da0", + "sha256:71f510b0efe1629bf2f7c0eadb1ff0b9cf611e87b73cd017e6b7d6adb40e2b3a", + "sha256:73f219fdc1777cf3c45fde7f0708732ec6950dfc598afc50588d0d285fddaefc", + "sha256:8092a368d3eb7116e270525329a3e5c15ae796ccdf7ccb17839a73b4f5084a39", + "sha256:82ae615826da838a8e5d4d630eb70c993ab8636f0eff13cb28aafc4291b632b5", + "sha256:9608000a5a45f663be6af5c70c3cbe634fa19243e720eb380c0d378666bc7702", + "sha256:a40dd1e9f22e01e66ed534d6a965eb99546b41d4d52dbdb66565608fde48203f", + "sha256:b4f5a82afa4f1ff482ab8ded2ae8a453a2cdfde2001567b3ca24a4c5c5ca0db3", + "sha256:c009a92e81ce836212ce7aa98b219db7961a8b95999b97af566b8dc8c33e9519", + "sha256:c218796d59d5abd8780170c937b812c9637e84c32f8271bbf9845970f8c1351f", + "sha256:cc3cd122bea268998b79adebbb8343b735a5511ec14efb70a39e7acbc11ccbdc", + "sha256:d0d8fd58df5d17ddb8c72a5075d87cd80d71b542571b5f78178fb067fa4e9c72", + "sha256:e18bc3764cbb5e118be139b3b611bc3fbc5d3be42a7e827d1096f46087b395eb", + "sha256:e2b83abd292194f350bb04e188f9379d36b8dfac24dd445d5c87575f3beaf789", + "sha256:e7469271497960b6a781eaa930cba8af400dd59b62ec9ca2f4d31a19f2f91090", + "sha256:e9dbacd22555c2d47f262ef96bb4e30880e5956169741400af8b306bbb24a273", + "sha256:f6257b314fc14958f8122779e5a1557517b0f8e500cfb2bd53fa1f75a8ad0af2" + ], + "index": "pypi", + "version": "==1.5.2" + }, + "python-dateutil": { + "hashes": [ + "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", + "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.8.2" + }, + "pytz": { + "hashes": [ + "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427", + "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2" + ], + "version": "==2022.6" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "yoshi-seals": { + "hashes": [ + "sha256:448de57bfee12999ecd56e456e8a13f312396030b9872a2b5c9eac729e07e097" + ], + "index": "pypi", + "version": "==2.0.3645235495" + } + }, + "develop": { + "black": { + "hashes": [ + "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7", + "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6", + "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650", + "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb", + "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d", + "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d", + "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de", + "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395", + "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae", + "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa", + "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef", + "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383", + "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66", + "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87", + "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d", + "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0", + "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b", + "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458", + "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4", + "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1", + "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff" + ], + "index": "pypi", + "version": "==22.10.0" + }, + "click": { + "hashes": [ + "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", + "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.3" + }, + "coverage": { + "hashes": [ + "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79", + "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a", + "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f", + "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a", + "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa", + "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398", + "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba", + "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d", + "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf", + "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b", + "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518", + "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d", + "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795", + "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2", + "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e", + "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32", + "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745", + "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b", + "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e", + "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d", + "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f", + "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660", + "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62", + "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6", + "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04", + "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c", + "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5", + "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef", + "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc", + "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae", + "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578", + "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466", + "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4", + "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91", + "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0", + "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4", + "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b", + "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe", + "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b", + "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75", + "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b", + "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c", + "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72", + "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b", + "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f", + "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e", + "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53", + "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3", + "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84", + "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987" + ], + "index": "pypi", + "version": "==6.5.0" + }, + "mypy-extensions": { + "hashes": [ + "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", + "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8" + ], + "version": "==0.4.3" + }, + "pathspec": { + "hashes": [ + "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5", + "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0" + ], + "markers": "python_version >= '3.7'", + "version": "==0.10.2" + }, + "platformdirs": { + "hashes": [ + "sha256:1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca", + "sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e" + ], + "markers": "python_version >= '3.7'", + "version": "==2.6.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_full_version < '3.11.0a7'", + "version": "==2.0.1" + } + } +} diff --git a/Source Code - Otter/Otter.py b/Source Code - Otter/Otter.py deleted file mode 100755 index 6a91ddc..0000000 --- a/Source Code - Otter/Otter.py +++ /dev/null @@ -1,515 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. -# -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -import math -import numpy as np -import pandas as pd -from Seals import process as sl - -class Algebra: - - def __init__(self, function): - self.f = function - self.integral = self.Integral(self.f) - self.roots = self.Roots(self.f) - self.edo = self.Edo(self.f) - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - class Integral: - - def __init__(self,function): - self.f = function - self.simple = self.Simple(function) - self.double = self.Double(function) - - class Simple: - def __init__(self, function): - self.f = function - - def riemann(self,a,b,n=None): - - if n is None: - n = 10**6 - - delta = (b-a)/n - - psi = a - theta = 0 - - while((psi+delta) <= b): - - theta += (self.f(psi) + self.f(psi + delta))/2 - psi += delta - - integral = delta*theta - - return integral - - def simpson(self,a,b,n=None): - - if n is None: - n = 10**6 - - def x(i): - return a + i*h - - h = (b-a)/n - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta = eta + self.f(x(2*psi - 1)) - psi = psi + 1 - - while(kappa <= ((n/2)-1)): - - theta = theta + self.f(x(2*kappa)) - kappa = kappa + 1 - - return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) - - - class Double: - - def __init__(self,function): - self.f = function - - def riemann(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - kappa = a - psi = c - theta = 0 - - while((psi + dy) < d): - - while((kappa + dx) < b): - - theta = theta + self.f(kappa, psi) - kappa = kappa + dx - - psi = psi + dy - kappa = a - - return theta*(dx)*(dy) - - def simpson(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - - def x(i): - - x = a + i*dx - - return x - - def y(i): - - y = c + i*dy - - return y - - def g(i): - - sigma = 0 - upsilon = 0 - - zeta = 1 - csi = 1 - - while(zeta <= (m/2)): - - sigma += self.f(x(i),y(2*zeta - 1)) - zeta += 1 - - while(csi <= ((m/2)-1)): - - upsilon += self.f(x(i),y(2*csi)) - csi += 1 - - return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta += g(2*psi - 1) - psi += 1 - - while(kappa <= ((n/2)-1)): - - theta += g(2*kappa) - kappa += 1 - - return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) - - class Roots: - - def __init__(self, function=None): - if function is not None: - self.f = function - - def bissec(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - while abs(a-b) > e: - - c = (a+b)/2 - fc = self.f(c) - - if (fa*fc) < 0: - - b = c - - else: - - a = c - fa = fc - - c = (a+b)/2 - - return c - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - def newton(self,a,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - da = self.d(a,e) - b = a - fa/da - - - while abs(a-b) > e: - - b = a - a -= (fa/da) - fa = self.f(a) - da = self.d(a,e) - - return a - - def bissec_newton(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - c = (a+b)/2 # 'c' é a raiz calculada - - while abs(a-b) > 0.1: - - fc = self.f(c) - - if fa*fc < 0: - - b = c - - else: - - a = c - fa = self.f(a) - - c = (a+b)/2 - - fc = self.f(c) - dc = self.d(c,e) - h = c - fc/dc # 'h' é uma variável de controle - - while abs(c-h) > e: - - h = c - c -= (fc/dc) - fc = self.f(c) - dc = self.d(c,e) - - return (c) - - - class Edo: - - def __init__(self, function): - self.F = function - - def euler(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return a + i*dx - - for i in range(n): - - y = y + (self.F(x(i),y))*dx - - return y - - def runge(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) - - return y - - def adams(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - f0 = self.F(x(i),y) - f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) - f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) - - y += (dx/12)*(5*f2 + 8*f1 - f0) - - return y - -class Interpolation: - """ Data should be organized in two columns: X and Y""" - - def __init__(self, data): - - self.data = data - self.polinomial = self.Polinomial(self.data) - - def minimus(self,x): - - theta = 0 - # somatorio de x - for i in range(self.data.shape[0]): - - theta += self.data.x[i] - - eta = 0 - #somatorio de y - for i in range(self.data.shape[0]): - - eta += self.data.y[i] - - sigma = 0 - #somatorio de xy - for i in range(self.data.shape[0]): - - sigma += self.data.x[i]*self.data.y[i] - - omega = 0 - #somatorio de x^2self.dself.dself.d - for i in range(self.data.shape[0]): - - omega += self.data.x[i]**2 - - - self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) - - self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) - - ym = 0 - - for i in range(self.data.shape[0]): - - ym += self.data.y[i]/self.data.shape[0] - - sqreq = 0 - - for i in range(self.data.shape[0]): - - sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 - - sqtot = 0 - - for i in range(self.data.shape[0]): - - sqtot += (self.data.y[i] - ym)**2 - - self.r2 = sqreq/sqtot - - return self.a*x + self.b - - class Polinomial: - - def __init__(self, data): - self.data = data - - def vandermonde(self, x): - - matrix = np.zeros((self.data.shape[0],self.data.shape[0])) - - for k in range(0, self.data.shape[0]): - - matrix[:,k] = self.data.x[:]**k - - self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) - - y = 0 - - for i in range(0,self.A.shape[0]): - - y += self.A[i]*(x**i) - - return float(y) - - def lagrange(self, x): - - def L(k,x): - - up = down = 1 - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - up = up*(x - self.data.x[i]) - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - down = down*(self.data.x[k] - self.data.x[i]) - - return up/down - - y = 0 - - for i in range(self.data.x.shape[0]): - - y += self.data.y[i]*L(i,x) - - return y - - def newton(self,x): - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) - j += 1 - - i += 1 - j = 0 - - def f(x): - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y - - self.f = f - - return f(x) - - def gregory(self,x): - - h = self.data.x[0] - self.data.x[1] - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) - j += 1 - - i += 1 - j = 0 - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y \ No newline at end of file diff --git a/Source Code - Otter/__init__.py b/Source Code - Otter/__init__.py deleted file mode 100644 index 08ce1fe..0000000 --- a/Source Code - Otter/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. - -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -from .Otter import Algebra as algebra -from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/yoshi-otter1.3.3/setup.py b/setup.py similarity index 94% rename from yoshi-otter1.3.3/setup.py rename to setup.py index 6c02dea..71bd148 100644 --- a/yoshi-otter1.3.3/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ import setuptools -with open("README.md", "r") as fh: +with open("yoshi-otter1.3.3/README.md", "r") as fh: long_description = fh.read() setuptools.setup( diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/algebra/__init__.py b/tests/algebra/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/algebra/edo/__init__.py b/tests/algebra/edo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/algebra/edo/test_edo.py b/tests/algebra/edo/test_edo.py new file mode 100644 index 0000000..6392abf --- /dev/null +++ b/tests/algebra/edo/test_edo.py @@ -0,0 +1,38 @@ +from yoshi_otter.algebra.edo import Edo + +import unittest + + +class TestEdo(unittest.TestCase): + + def setUp(self): + def f(x, y): + return 2*x + + self.f = f + + def test_class_instantiation(self): + edo = Edo(self.f) + self.assertIsInstance(edo, Edo) + + def test_euler(self): + edo = Edo(self.f) + y = edo.euler(0, 0, 1) + + self.assertAlmostEqual(y, 1, 5) + + def test_runge(self): + edo = Edo(self.f) + y = edo.runge(0, 0, 1) + + self.assertAlmostEqual(y, 1, 5) + + def test_adams(self): + edo = Edo(self.f) + y = edo.adams(0, 0, 1) + + self.assertAlmostEqual(y, 1, 5) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/algebra/integral/__init__.py b/tests/algebra/integral/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/algebra/integral/test_integral_double.py b/tests/algebra/integral/test_integral_double.py new file mode 100644 index 0000000..0ce31a8 --- /dev/null +++ b/tests/algebra/integral/test_integral_double.py @@ -0,0 +1,35 @@ +from yoshi_otter.algebra.integral.double import Double + +import unittest + + +class MyTestCase(unittest.TestCase): + + def setUp(self): + def g(x, y): + return x*y + + self.g = g + + def test_class_instantiation(self): + Double(self.g) + + def test_riemann(self): + + double = Double(self.g) + + integral = double.riemann(0, 1, 0, 1, n=10**3) + + self.assertAlmostEqual(integral, .25, 2) + + def test_simpson(self): + + double = Double(self.g) + + integral = double.simpson(0, 1, 0, 1, n=10) + + self.assertAlmostEqual(integral, .25, 7) # add assertion here + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/algebra/integral/test_integral_simple.py b/tests/algebra/integral/test_integral_simple.py new file mode 100644 index 0000000..f9474c0 --- /dev/null +++ b/tests/algebra/integral/test_integral_simple.py @@ -0,0 +1,35 @@ +from yoshi_otter.algebra.integral.simple import Simple + +import unittest + + +class MyTestCase(unittest.TestCase): + + def setUp(self): + def f(x): + return 2*x + + self.f = f + + def test_class_instantiation(self): + Simple(self.f) + + def test_riemann(self): + + simple = Simple(self.f) + + integral = simple.riemann(0, 1) + + self.assertAlmostEqual(integral, 1, 5) + + def test_simpson(self): + + simple = Simple(self.f) + + integral = simple.simpson(0, 1) + + self.assertAlmostEqual(integral, 1, 5) # add assertion here + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/algebra/roots/__init__.py b/tests/algebra/roots/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/algebra/roots/test_roots.py b/tests/algebra/roots/test_roots.py new file mode 100644 index 0000000..fde168d --- /dev/null +++ b/tests/algebra/roots/test_roots.py @@ -0,0 +1,38 @@ +import unittest + +from yoshi_otter.algebra.roots import Roots + + +class TestRoots(unittest.TestCase): + + def setUp(self): + def f(x): + return x + + self.f = f + + def test_class_instantiation(self): + roots = Roots(self.f) + self.assertIsInstance(roots, Roots) + + def test_bissec(self): + roots = Roots(self.f) + result = roots.bissec(-1, 1) + + self.assertAlmostEqual(result, 0, 6) + + def test_newton(self): + roots = Roots(self.f) + result = roots.newton(-1) + + self.assertAlmostEqual(result, 0, 6) + + def test_bissec_newton(self): + roots = Roots(self.f) + result = roots.bissec_newton(-1, 1) + + self.assertAlmostEqual(result, 0, 6) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/algebra/test_algebra.py b/tests/algebra/test_algebra.py new file mode 100644 index 0000000..f7ecad7 --- /dev/null +++ b/tests/algebra/test_algebra.py @@ -0,0 +1,37 @@ +from yoshi_otter.shared import InvalidFunctionSignature +from yoshi_otter import algebra as ot + +import unittest + + +class TestOtterAlgebra(unittest.TestCase): + + def setUp(self): + def f(x): + return 2*x + + def g(x, y): + return x*y + + self.f = f + self.g = g + + def test_class_instantiation(self): + algebra = ot.Algebra(self.f) + self.assertIsInstance(algebra, ot.Algebra) + + def test_derivative(self): + algebra = ot.Algebra(self.f) + derivative = algebra.d(0) + + self.assertEqual(derivative, 2) + + def test_derivative_raises_exception(self): + algebra = ot.Algebra(self.g) + + with self.assertRaises(InvalidFunctionSignature): + algebra.d(0) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/interpolation/__init__.py b/tests/interpolation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/interpolation/test_interpolation.py b/tests/interpolation/test_interpolation.py new file mode 100644 index 0000000..bf542d9 --- /dev/null +++ b/tests/interpolation/test_interpolation.py @@ -0,0 +1,67 @@ +from yoshi_otter.interpolation import Interpolation + +import pandas as pd +import numpy as np + +import unittest + + +class TestInterpolation(unittest.TestCase): + + def setUp(self) -> None: + def f(x): + return 2 * x + + def g(x): + return x + x**2 + + X = np.linspace(0, 1000, num=1000) + Y = [f(x) for x in X] + + self.data = pd.DataFrame(data={'X': X, 'Y': Y}) + + Y = [g(x) for x in X] + + self.data_pol = pd.DataFrame(data={'X': X, 'Y': Y}) + + def test_class_instantiation(self): + interpolation = Interpolation(self.data) + self.assertIsInstance(interpolation, Interpolation) + + def test_minimums(self): + interpolation = Interpolation(self.data) + func, r2 = interpolation.minimums() + + self.assertEqual(func(1), 2) + + @unittest.skip("Temporally not working") + def test_polynomial_vandermonde(self): + interpolation = Interpolation(self.data_pol) + func = interpolation.polynomial.vandermonde() + + self.assertEqual(func(1), 2) + + @unittest.skip("Temporally not working") + def test_polynomial_lagrange(self): + interpolation = Interpolation(self.data_pol) + result = interpolation.polynomial.lagrange(1) + + self.assertEqual(result, 2) + + @unittest.skip("Temporally not working") + def test_polynomial_newton(self): + interpolation = Interpolation(self.data_pol) + result = interpolation.polynomial.newton(1) + + self.assertEqual(result, 2) + + @unittest.skip("Temporally not working") + def test_polynomial_gregory(self): + interpolation = Interpolation(self.data_pol) + result = interpolation.polynomial.gregory(1) + + self.assertEqual(result, 2) + + +if __name__ == '__main__': + unittest.main() diff --git a/yoshi-otter1.3.3/LICENSE b/yoshi-otter1.3.3/LICENSE deleted file mode 100644 index d2c5abe..0000000 --- a/yoshi-otter1.3.3/LICENSE +++ /dev/null @@ -1,278 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/yoshi-otter1.3.3/Otter/Otter.py b/yoshi-otter1.3.3/Otter/Otter.py deleted file mode 100755 index 6a91ddc..0000000 --- a/yoshi-otter1.3.3/Otter/Otter.py +++ /dev/null @@ -1,515 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. -# -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -import math -import numpy as np -import pandas as pd -from Seals import process as sl - -class Algebra: - - def __init__(self, function): - self.f = function - self.integral = self.Integral(self.f) - self.roots = self.Roots(self.f) - self.edo = self.Edo(self.f) - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - class Integral: - - def __init__(self,function): - self.f = function - self.simple = self.Simple(function) - self.double = self.Double(function) - - class Simple: - def __init__(self, function): - self.f = function - - def riemann(self,a,b,n=None): - - if n is None: - n = 10**6 - - delta = (b-a)/n - - psi = a - theta = 0 - - while((psi+delta) <= b): - - theta += (self.f(psi) + self.f(psi + delta))/2 - psi += delta - - integral = delta*theta - - return integral - - def simpson(self,a,b,n=None): - - if n is None: - n = 10**6 - - def x(i): - return a + i*h - - h = (b-a)/n - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta = eta + self.f(x(2*psi - 1)) - psi = psi + 1 - - while(kappa <= ((n/2)-1)): - - theta = theta + self.f(x(2*kappa)) - kappa = kappa + 1 - - return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) - - - class Double: - - def __init__(self,function): - self.f = function - - def riemann(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - kappa = a - psi = c - theta = 0 - - while((psi + dy) < d): - - while((kappa + dx) < b): - - theta = theta + self.f(kappa, psi) - kappa = kappa + dx - - psi = psi + dy - kappa = a - - return theta*(dx)*(dy) - - def simpson(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - - def x(i): - - x = a + i*dx - - return x - - def y(i): - - y = c + i*dy - - return y - - def g(i): - - sigma = 0 - upsilon = 0 - - zeta = 1 - csi = 1 - - while(zeta <= (m/2)): - - sigma += self.f(x(i),y(2*zeta - 1)) - zeta += 1 - - while(csi <= ((m/2)-1)): - - upsilon += self.f(x(i),y(2*csi)) - csi += 1 - - return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta += g(2*psi - 1) - psi += 1 - - while(kappa <= ((n/2)-1)): - - theta += g(2*kappa) - kappa += 1 - - return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) - - class Roots: - - def __init__(self, function=None): - if function is not None: - self.f = function - - def bissec(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - while abs(a-b) > e: - - c = (a+b)/2 - fc = self.f(c) - - if (fa*fc) < 0: - - b = c - - else: - - a = c - fa = fc - - c = (a+b)/2 - - return c - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - def newton(self,a,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - da = self.d(a,e) - b = a - fa/da - - - while abs(a-b) > e: - - b = a - a -= (fa/da) - fa = self.f(a) - da = self.d(a,e) - - return a - - def bissec_newton(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - c = (a+b)/2 # 'c' é a raiz calculada - - while abs(a-b) > 0.1: - - fc = self.f(c) - - if fa*fc < 0: - - b = c - - else: - - a = c - fa = self.f(a) - - c = (a+b)/2 - - fc = self.f(c) - dc = self.d(c,e) - h = c - fc/dc # 'h' é uma variável de controle - - while abs(c-h) > e: - - h = c - c -= (fc/dc) - fc = self.f(c) - dc = self.d(c,e) - - return (c) - - - class Edo: - - def __init__(self, function): - self.F = function - - def euler(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return a + i*dx - - for i in range(n): - - y = y + (self.F(x(i),y))*dx - - return y - - def runge(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) - - return y - - def adams(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - f0 = self.F(x(i),y) - f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) - f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) - - y += (dx/12)*(5*f2 + 8*f1 - f0) - - return y - -class Interpolation: - """ Data should be organized in two columns: X and Y""" - - def __init__(self, data): - - self.data = data - self.polinomial = self.Polinomial(self.data) - - def minimus(self,x): - - theta = 0 - # somatorio de x - for i in range(self.data.shape[0]): - - theta += self.data.x[i] - - eta = 0 - #somatorio de y - for i in range(self.data.shape[0]): - - eta += self.data.y[i] - - sigma = 0 - #somatorio de xy - for i in range(self.data.shape[0]): - - sigma += self.data.x[i]*self.data.y[i] - - omega = 0 - #somatorio de x^2self.dself.dself.d - for i in range(self.data.shape[0]): - - omega += self.data.x[i]**2 - - - self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) - - self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) - - ym = 0 - - for i in range(self.data.shape[0]): - - ym += self.data.y[i]/self.data.shape[0] - - sqreq = 0 - - for i in range(self.data.shape[0]): - - sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 - - sqtot = 0 - - for i in range(self.data.shape[0]): - - sqtot += (self.data.y[i] - ym)**2 - - self.r2 = sqreq/sqtot - - return self.a*x + self.b - - class Polinomial: - - def __init__(self, data): - self.data = data - - def vandermonde(self, x): - - matrix = np.zeros((self.data.shape[0],self.data.shape[0])) - - for k in range(0, self.data.shape[0]): - - matrix[:,k] = self.data.x[:]**k - - self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) - - y = 0 - - for i in range(0,self.A.shape[0]): - - y += self.A[i]*(x**i) - - return float(y) - - def lagrange(self, x): - - def L(k,x): - - up = down = 1 - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - up = up*(x - self.data.x[i]) - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - down = down*(self.data.x[k] - self.data.x[i]) - - return up/down - - y = 0 - - for i in range(self.data.x.shape[0]): - - y += self.data.y[i]*L(i,x) - - return y - - def newton(self,x): - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) - j += 1 - - i += 1 - j = 0 - - def f(x): - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y - - self.f = f - - return f(x) - - def gregory(self,x): - - h = self.data.x[0] - self.data.x[1] - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) - j += 1 - - i += 1 - j = 0 - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y \ No newline at end of file diff --git a/yoshi-otter1.3.3/Otter/__init__.py b/yoshi-otter1.3.3/Otter/__init__.py deleted file mode 100644 index 08ce1fe..0000000 --- a/yoshi-otter1.3.3/Otter/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. - -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -from .Otter import Algebra as algebra -from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/yoshi-otter1.3.3/README.md b/yoshi-otter1.3.3/README.md deleted file mode 100644 index 167eb4e..0000000 --- a/yoshi-otter1.3.3/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# Otter - Numeric Calculus - -This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: - -* Receive one variable function from user input - -* Receive two variable function from user input - -* Performe derivatives with one variable functions - -* Performe integral with received functions - -* Use methods to proccess the matrices. - -* Find root of functions throw method of bissection and method of newton - -* Solve Diferential Equations throw method of euler and runge - -* Performe Minimus Interpolation and Polinomial Interpolation - -## Syntax - -To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. - -To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. - -### Algebra - -Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). - -#### Integral - -To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. - -After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. - -The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. - -If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. - -#### Roots - -To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. - -The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. - -The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. - -If `e` is not defined the standart value is 10^(-6). - -#### Diferential Equations - -To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. - -The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. - -If `n` is not defined the standart value is 10^7. - -### Interpolation - -The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. - -To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `data` is a data frame containing values for *x* and *y*, `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. - -To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. - -## Installation - -To install the package from source `cd` into the directory and run: - -`pip install .` - -or run - -`pip install yoshi-otter` diff --git a/yoshi-otter1.3.3/build/lib/Otter/Otter.py b/yoshi-otter1.3.3/build/lib/Otter/Otter.py deleted file mode 100644 index 6a91ddc..0000000 --- a/yoshi-otter1.3.3/build/lib/Otter/Otter.py +++ /dev/null @@ -1,515 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. -# -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -import math -import numpy as np -import pandas as pd -from Seals import process as sl - -class Algebra: - - def __init__(self, function): - self.f = function - self.integral = self.Integral(self.f) - self.roots = self.Roots(self.f) - self.edo = self.Edo(self.f) - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - class Integral: - - def __init__(self,function): - self.f = function - self.simple = self.Simple(function) - self.double = self.Double(function) - - class Simple: - def __init__(self, function): - self.f = function - - def riemann(self,a,b,n=None): - - if n is None: - n = 10**6 - - delta = (b-a)/n - - psi = a - theta = 0 - - while((psi+delta) <= b): - - theta += (self.f(psi) + self.f(psi + delta))/2 - psi += delta - - integral = delta*theta - - return integral - - def simpson(self,a,b,n=None): - - if n is None: - n = 10**6 - - def x(i): - return a + i*h - - h = (b-a)/n - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta = eta + self.f(x(2*psi - 1)) - psi = psi + 1 - - while(kappa <= ((n/2)-1)): - - theta = theta + self.f(x(2*kappa)) - kappa = kappa + 1 - - return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) - - - class Double: - - def __init__(self,function): - self.f = function - - def riemann(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - kappa = a - psi = c - theta = 0 - - while((psi + dy) < d): - - while((kappa + dx) < b): - - theta = theta + self.f(kappa, psi) - kappa = kappa + dx - - psi = psi + dy - kappa = a - - return theta*(dx)*(dy) - - def simpson(self,a,b,c,d,n=None,m=None): - - if n is None: - n = 10**4 - - if m is None: - m = n - - dx = (b-a)/n - dy = (d-c)/m - - def x(i): - - x = a + i*dx - - return x - - def y(i): - - y = c + i*dy - - return y - - def g(i): - - sigma = 0 - upsilon = 0 - - zeta = 1 - csi = 1 - - while(zeta <= (m/2)): - - sigma += self.f(x(i),y(2*zeta - 1)) - zeta += 1 - - while(csi <= ((m/2)-1)): - - upsilon += self.f(x(i),y(2*csi)) - csi += 1 - - return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) - - eta = 0 - theta = 0 - - psi = 1 - kappa = 1 - - while(psi <= (n/2)): - - eta += g(2*psi - 1) - psi += 1 - - while(kappa <= ((n/2)-1)): - - theta += g(2*kappa) - kappa += 1 - - return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) - - class Roots: - - def __init__(self, function=None): - if function is not None: - self.f = function - - def bissec(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - while abs(a-b) > e: - - c = (a+b)/2 - fc = self.f(c) - - if (fa*fc) < 0: - - b = c - - else: - - a = c - fa = fc - - c = (a+b)/2 - - return c - - def d(self, x, e): - return (self.f(x + e) - self.f(x - e))/(2*e) - - def newton(self,a,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - da = self.d(a,e) - b = a - fa/da - - - while abs(a-b) > e: - - b = a - a -= (fa/da) - fa = self.f(a) - da = self.d(a,e) - - return a - - def bissec_newton(self,a,b,e=None): - - if e is None: - e = 10**(-6) - - fa = self.f(a) - - c = (a+b)/2 # 'c' é a raiz calculada - - while abs(a-b) > 0.1: - - fc = self.f(c) - - if fa*fc < 0: - - b = c - - else: - - a = c - fa = self.f(a) - - c = (a+b)/2 - - fc = self.f(c) - dc = self.d(c,e) - h = c - fc/dc # 'h' é uma variável de controle - - while abs(c-h) > e: - - h = c - c -= (fc/dc) - fc = self.f(c) - dc = self.d(c,e) - - return (c) - - - class Edo: - - def __init__(self, function): - self.F = function - - def euler(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return a + i*dx - - for i in range(n): - - y = y + (self.F(x(i),y))*dx - - return y - - def runge(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) - - return y - - def adams(self,a,y,b,n=None): - - if n is None: - n = 10**6 - - dx = (b-a)/n - - def x(i): - return (a + i*dx) - - for i in range(n): - - f0 = self.F(x(i),y) - f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) - f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) - - y += (dx/12)*(5*f2 + 8*f1 - f0) - - return y - -class Interpolation: - """ Data should be organized in two columns: X and Y""" - - def __init__(self, data): - - self.data = data - self.polinomial = self.Polinomial(self.data) - - def minimus(self,x): - - theta = 0 - # somatorio de x - for i in range(self.data.shape[0]): - - theta += self.data.x[i] - - eta = 0 - #somatorio de y - for i in range(self.data.shape[0]): - - eta += self.data.y[i] - - sigma = 0 - #somatorio de xy - for i in range(self.data.shape[0]): - - sigma += self.data.x[i]*self.data.y[i] - - omega = 0 - #somatorio de x^2self.dself.dself.d - for i in range(self.data.shape[0]): - - omega += self.data.x[i]**2 - - - self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) - - self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) - - ym = 0 - - for i in range(self.data.shape[0]): - - ym += self.data.y[i]/self.data.shape[0] - - sqreq = 0 - - for i in range(self.data.shape[0]): - - sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 - - sqtot = 0 - - for i in range(self.data.shape[0]): - - sqtot += (self.data.y[i] - ym)**2 - - self.r2 = sqreq/sqtot - - return self.a*x + self.b - - class Polinomial: - - def __init__(self, data): - self.data = data - - def vandermonde(self, x): - - matrix = np.zeros((self.data.shape[0],self.data.shape[0])) - - for k in range(0, self.data.shape[0]): - - matrix[:,k] = self.data.x[:]**k - - self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) - - y = 0 - - for i in range(0,self.A.shape[0]): - - y += self.A[i]*(x**i) - - return float(y) - - def lagrange(self, x): - - def L(k,x): - - up = down = 1 - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - up = up*(x - self.data.x[i]) - - for i in [x for x in range(self.data.x.shape[0]) if x != k]: - down = down*(self.data.x[k] - self.data.x[i]) - - return up/down - - y = 0 - - for i in range(self.data.x.shape[0]): - - y += self.data.y[i]*L(i,x) - - return y - - def newton(self,x): - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) - j += 1 - - i += 1 - j = 0 - - def f(x): - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y - - self.f = f - - return f(x) - - def gregory(self,x): - - h = self.data.x[0] - self.data.x[1] - - d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) - - d[0] = self.data.y - - i = j = 0 - - while (i < self.data.shape[0]): - - while (j < (self.data.shape[0]-(i+1))): - - d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) - j += 1 - - i += 1 - j = 0 - - y = d[0][0] - i = 0 - - while ((i+1) < self.data.shape[0]): - - mult = 1 - k = 0 - while (k <= i): - mult = mult*(x - self.data.x[k]) - k += 1 - - y += d[i+1][0]*mult - i += 1 - - return y \ No newline at end of file diff --git a/yoshi-otter1.3.3/build/lib/Otter/__init__.py b/yoshi-otter1.3.3/build/lib/Otter/__init__.py deleted file mode 100644 index 08ce1fe..0000000 --- a/yoshi-otter1.3.3/build/lib/Otter/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# Otter - Program made for educational intent, can be freely distributed -# and can be used for economical intent. I will not take legal actions -# unless my intelectual propperty, the code, is stolen or change without permission. - -# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as published by -# the Free Software Foundation. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -from .Otter import Algebra as algebra -from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/yoshi-otter1.3.3/dist/yoshi-otter-1.3.3.tar.gz b/yoshi-otter1.3.3/dist/yoshi-otter-1.3.3.tar.gz deleted file mode 100644 index 1c8cb116de7975b37792249b2ae533876b6537d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5813 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 Gy!{_y3O%_1 diff --git a/yoshi-otter1.3.3/yoshi_otter.egg-info/PKG-INFO b/yoshi-otter1.3.3/yoshi_otter.egg-info/PKG-INFO deleted file mode 100644 index 36a6cec..0000000 --- a/yoshi-otter1.3.3/yoshi_otter.egg-info/PKG-INFO +++ /dev/null @@ -1,91 +0,0 @@ -Metadata-Version: 2.1 -Name: yoshi-otter -Version: 1.3.3 -Summary: Numeric Calculus python module in the topic of Algebra Functions -Home-page: https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git -Author: Vitor Hideyoshi -Author-email: vitor.h.n.batista@gmail.com -License: UNKNOWN -Description: # Otter - Numeric Calculus - - This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: - - * Receive one variable function from user input - - * Receive two variable function from user input - - * Performe derivatives with one variable functions - - * Performe integral with received functions - - * Use methods to proccess the matrices. - - * Find root of functions throw method of bissection and method of newton - - * Solve Diferential Equations throw method of euler and runge - - * Performe Minimus Interpolation and Polinomial Interpolation - - ## Syntax - - To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. - - To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. - - ### Algebra - - Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). - - #### Integral - - To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. - - After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. - - The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. - - If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. - - #### Roots - - To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. - - The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. - - The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. - - If `e` is not defined the standart value is 10^(-6). - - #### Diferential Equations - - To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. - - The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. - - If `n` is not defined the standart value is 10^7. - - ### Interpolation - - The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. - - To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `data` is a data frame containing values for *x* and *y*, `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. - - To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. - - ## Installation - - To install the package from source `cd` into the directory and run: - - `pip install .` - - or run - - `pip install yoshi-otter` - -Platform: UNKNOWN -Classifier: Programming Language :: Python :: 3 -Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2) -Classifier: Operating System :: OS Independent -Classifier: Development Status :: 2 - Pre-Alpha -Requires-Python: >=3.6 -Description-Content-Type: text/markdown diff --git a/yoshi-otter1.3.3/yoshi_otter.egg-info/SOURCES.txt b/yoshi-otter1.3.3/yoshi_otter.egg-info/SOURCES.txt deleted file mode 100644 index 5dc205c..0000000 --- a/yoshi-otter1.3.3/yoshi_otter.egg-info/SOURCES.txt +++ /dev/null @@ -1,9 +0,0 @@ -README.md -setup.py -Otter/Otter.py -Otter/__init__.py -yoshi_otter.egg-info/PKG-INFO -yoshi_otter.egg-info/SOURCES.txt -yoshi_otter.egg-info/dependency_links.txt -yoshi_otter.egg-info/requires.txt -yoshi_otter.egg-info/top_level.txt \ No newline at end of file diff --git a/yoshi-otter1.3.3/yoshi_otter.egg-info/dependency_links.txt b/yoshi-otter1.3.3/yoshi_otter.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/yoshi-otter1.3.3/yoshi_otter.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/yoshi-otter1.3.3/yoshi_otter.egg-info/requires.txt b/yoshi-otter1.3.3/yoshi_otter.egg-info/requires.txt deleted file mode 100644 index 11c1c26..0000000 --- a/yoshi-otter1.3.3/yoshi_otter.egg-info/requires.txt +++ /dev/null @@ -1,3 +0,0 @@ -numpy -pandas -yoshi-seals diff --git a/yoshi-otter1.3.3/yoshi_otter.egg-info/top_level.txt b/yoshi-otter1.3.3/yoshi_otter.egg-info/top_level.txt deleted file mode 100644 index ccaaf54..0000000 --- a/yoshi-otter1.3.3/yoshi_otter.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -Otter diff --git a/Older Versions/yoshi-otter1.3.1/build/lib/Otter/__init__.py b/yoshi_otter/__init__.py similarity index 90% rename from Older Versions/yoshi-otter1.3.1/build/lib/Otter/__init__.py rename to yoshi_otter/__init__.py index 08ce1fe..6d942f2 100644 --- a/Older Versions/yoshi-otter1.3.1/build/lib/Otter/__init__.py +++ b/yoshi_otter/__init__.py @@ -17,5 +17,5 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -from .Otter import Algebra as algebra -from .Otter import Interpolation as interpolation \ No newline at end of file +from yoshi_otter.algebra import Algebra +from yoshi_otter.interpolation import Interpolation diff --git a/yoshi_otter/algebra/__algebra.py b/yoshi_otter/algebra/__algebra.py new file mode 100644 index 0000000..9f81ae1 --- /dev/null +++ b/yoshi_otter/algebra/__algebra.py @@ -0,0 +1,52 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. +# +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from yoshi_otter.algebra.integral.double import Double +from yoshi_otter.algebra.integral.simple import Simple +from yoshi_otter.algebra.roots import Roots +from yoshi_otter.algebra.edo import Edo + +from typing import Callable, Union +from inspect import signature + +from yoshi_otter.shared import InvalidFunctionSignature + + +class Algebra: + + def __init__(self, function: Callable[[float], float] | Callable[[float, float], float]) -> None: + self.f = function + + self.integral = self.__Integral(self.f) + self.roots = Roots(self.f) + self.edo = Edo(self.f) + + def d(self, x: float, e: float = 10 ** -4) -> float: + if len(signature(self.f).parameters) == 1: + return (self.f(x + e) - self.f(x - e)) / (2 * e) + else: + raise InvalidFunctionSignature("This method is only valid for one dimensional functions.") + + class __Integral: + + def __init__(self, function: Union[Callable[[float], float], Callable[[float, float], float]]) -> None: + self.f = function + + self.simple = Simple(self.f) + self.double = Double(self.f) diff --git a/yoshi_otter/algebra/__init__.py b/yoshi_otter/algebra/__init__.py new file mode 100644 index 0000000..a0f9bb4 --- /dev/null +++ b/yoshi_otter/algebra/__init__.py @@ -0,0 +1 @@ +from .__algebra import Algebra \ No newline at end of file diff --git a/yoshi_otter/algebra/edo/__edo.py b/yoshi_otter/algebra/edo/__edo.py new file mode 100644 index 0000000..f33ecb4 --- /dev/null +++ b/yoshi_otter/algebra/edo/__edo.py @@ -0,0 +1,51 @@ +from typing import Callable + + +class Edo: + + def __init__(self, function: Callable[[float], float]) -> None: + self.F = function + + def euler(self, a: float, y: float, b: float, n: int = 10**6) -> float: + + dx = (b - a) / n + + def x(i): + return a + i * dx + + for i in range(n): + y = y + (self.F(x(i), y)) * dx + + return y + + def runge(self, a: float, y: float, b: float, n: int = 10**6) -> float: + + dx = (b - a) / n + + def x(i): + return a + i * dx + + for i in range(n): + y = y + (dx / 2) * (self.F(x(i), y) + self.F(x(i + 1), (y + (dx * self.F(x(i), y))))) + + return y + + def adams(self, a: float, y: float, b: float, n: int = None + ) -> float: + + if n is None: + n = 10 ** 6 + + dx = (b - a) / n + + def x(i): + return a + i * dx + + for i in range(n): + f0 = self.F(x(i), y) + f1 = self.F(x(i + 1), y + dx * self.F(x(i) + (dx / 2), y + (dx / 2) * self.F(x(i), y))) + f2 = self.F(x(i + 2), y + (dx / 2) * (3 * f1 - f0)) + + y += (dx / 12) * (5 * f2 + 8 * f1 - f0) + + return y \ No newline at end of file diff --git a/yoshi_otter/algebra/edo/__init__.py b/yoshi_otter/algebra/edo/__init__.py new file mode 100644 index 0000000..5efeb11 --- /dev/null +++ b/yoshi_otter/algebra/edo/__init__.py @@ -0,0 +1 @@ +from .__edo import Edo diff --git a/yoshi_otter/algebra/integral/__init__.py b/yoshi_otter/algebra/integral/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/yoshi_otter/algebra/integral/double.py b/yoshi_otter/algebra/integral/double.py new file mode 100644 index 0000000..ddcd89c --- /dev/null +++ b/yoshi_otter/algebra/integral/double.py @@ -0,0 +1,79 @@ +from typing import Callable + + +class Double: + + def __init__(self, function: Callable[[float, float], float]): + self.f = function + + def riemann(self, a: float, b: float, c: float, d: float, + n: int = 10 ** 4, m: int = None) -> float: + + if m is None: + m = n + + dx = (b - a) / n + dy = (d - c) / m + kappa = a + psi = c + theta = 0 + + while (psi + dy) < d: + + while (kappa + dx) < b: + theta = theta + self.f(kappa, psi) + kappa = kappa + dx + + psi = psi + dy + kappa = a + + return theta * dx * dy + + def simpson(self, a: float, b: float, c: float, d: float, + n: int = 10 ** 4, m: int = None) -> float: + + if m is None: + m = n + + dx = (b - a) / n + dy = (d - c) / m + + def x(i): + return a + i * dx + + def y(i): + return c + i * dy + + def g(i): + + sigma = 0 + upsilon = 0 + + zeta = 1 + csi = 1 + + while zeta <= (m / 2): + sigma += self.f(x(i), y(2 * zeta - 1)) + zeta += 1 + + while csi <= ((m / 2) - 1): + upsilon += self.f(x(i), y(2 * csi)) + csi += 1 + + return (dy / 3) * (self.f(x(i), y(0)) + self.f(x(i), y(m)) + 4 * sigma + 2 * upsilon) + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while psi <= (n / 2): + eta += g(2 * psi - 1) + psi += 1 + + while kappa <= ((n / 2) - 1): + theta += g(2 * kappa) + kappa += 1 + + return (dx / 3) * (g(0) + g(n) + 4 * eta + 2 * theta) diff --git a/yoshi_otter/algebra/integral/simple.py b/yoshi_otter/algebra/integral/simple.py new file mode 100644 index 0000000..239916b --- /dev/null +++ b/yoshi_otter/algebra/integral/simple.py @@ -0,0 +1,44 @@ +from typing import Callable + + +class Simple: + def __init__(self, function: Callable[[float], float]) -> None: + self.f = function + + def riemann(self, a: float, b: float, n: int = 10 ** 6) -> float: + + delta = (b - a) / n + + psi = a + theta = 0 + + while (psi + delta) <= b: + theta += (self.f(psi) + self.f(psi + delta)) / 2 + psi += delta + + integral = delta * theta + + return integral + + def simpson(self, a: float, b: float, n: int = 10 ** 6) -> float: + + def x(i): + return a + i * h + + h = (b - a) / n + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while psi <= (n / 2): + eta = eta + self.f(x(2 * psi - 1)) + psi = psi + 1 + + while kappa <= ((n / 2) - 1): + theta = theta + self.f(x(2 * kappa)) + kappa = kappa + 1 + + return (h / 3) * (self.f(x(0)) + self.f(x(n)) + 4 * eta + 2 * theta) \ No newline at end of file diff --git a/yoshi_otter/algebra/roots/__init__.py b/yoshi_otter/algebra/roots/__init__.py new file mode 100644 index 0000000..2a2e986 --- /dev/null +++ b/yoshi_otter/algebra/roots/__init__.py @@ -0,0 +1 @@ +from .__roots import Roots diff --git a/yoshi_otter/algebra/roots/__roots.py b/yoshi_otter/algebra/roots/__roots.py new file mode 100644 index 0000000..3570be8 --- /dev/null +++ b/yoshi_otter/algebra/roots/__roots.py @@ -0,0 +1,80 @@ +from typing import Callable + + +class Roots: + + def __init__(self, function: Callable[[float], float] = None + ) -> float: + if function is not None: + self.f = function + + def bissec(self, a: float, b: float, e: float = 10**-6) -> float: + + fa = self.f(a) + + while abs(a - b) > e: + + c = (a + b) / 2 + fc = self.f(c) + + if (fa * fc) < 0: + + b = c + + else: + + a = c + + c = (a + b) / 2 + + return c + + def __d(self, x: float, e: float) -> float: + return (self.f(x + e) - self.f(x - e)) / (2 * e) + + def newton(self, a: float, e: float = 10**-6) -> float: + + fa = self.f(a) + da = self.__d(a, e) + b = a - fa / da + + while abs(a - b) > e: + b = a + a -= (fa / da) + fa = self.f(a) + da = self.__d(a, e) + + return a + + def bissec_newton(self, a: float, b: float, e: float = 10**-6) -> float: + + fa = self.f(a) + + c = (a + b) / 2 # 'c' é a raiz calculada + + while abs(a - b) > 0.1: + + fc = self.f(c) + + if fa * fc < 0: + + b = c + + else: + + a = c + fa = self.f(a) + + c = (a + b) / 2 + + fc = self.f(c) + dc = self.__d(c, e) + h = c - fc / dc # 'h' é uma variável de controle + + while abs(c - h) > e: + h = c + c -= (fc / dc) + fc = self.f(c) + dc = self.__d(c, e) + + return c \ No newline at end of file diff --git a/yoshi_otter/interpolation/__init__.py b/yoshi_otter/interpolation/__init__.py new file mode 100644 index 0000000..c97c3ef --- /dev/null +++ b/yoshi_otter/interpolation/__init__.py @@ -0,0 +1 @@ +from .__interpolation import Interpolation diff --git a/yoshi_otter/interpolation/__interpolation.py b/yoshi_otter/interpolation/__interpolation.py new file mode 100644 index 0000000..53f5362 --- /dev/null +++ b/yoshi_otter/interpolation/__interpolation.py @@ -0,0 +1,183 @@ +from typing import Callable, Any + +from yoshi_seals import process as sl + +import numpy as np + + +class Interpolation: + """ + Data should be organized in a dataframe of two columns: X and Y + """ + + def __init__(self, data) -> None: + + self.data = data + self.polynomial = self.Polynomial(self.data) + + def minimums(self) -> Callable[[Any], float]: + + theta = 0 + # somatorio de x + for i in range(self.data.shape[0]): + theta += self.data.X[i] + + eta = 0 + # somatorio de y + for i in range(self.data.shape[0]): + eta += self.data.Y[i] + + sigma = 0 + # somatorio de xy + for i in range(self.data.shape[0]): + sigma += self.data.X[i] * self.data.Y[i] + + omega = 0 + # somatorio de x^2self.dself.dself.d + for i in range(self.data.shape[0]): + omega += self.data.X[i] ** 2 + + a = (self.data.shape[0] * sigma - theta * eta) / (self.data.shape[0] * omega - (theta ** 2)) + + b = (theta * sigma - eta * omega) / ((theta ** 2) - self.data.shape[0] * omega) + + ym = 0 + + for i in range(self.data.shape[0]): + ym += self.data.Y[i] / self.data.shape[0] + + sqreq = 0 + + for i in range(self.data.shape[0]): + sqreq += ((a * self.data.X[i] + b) - ym) ** 2 + + sqtot = 0 + + for i in range(self.data.shape[0]): + sqtot += (self.data.Y[i] - ym) ** 2 + + r2 = sqreq / sqtot + + return lambda x: a * x + b, r2 + + class Polynomial: + + def __init__(self, data) -> None: + self.data = data + + def vandermonde(self) -> Callable[[Any], float]: + + matrix = np.zeros((self.data.shape[0], self.data.shape[0])) + + for k in range(0, self.data.shape[0]): + matrix[:, k] = self.data.X[:] ** k + + array = np.array(self.data.Y.tolist()).reshape(self.data.shape[0], 1) + A = sl.gauss(matrix, array) + + def f(coefficient_matrix, x): + + y = 0 + + for i in range(0, A.shape[0]): + y += coefficient_matrix[1][i] * (x ** i) + + return y + + return lambda x: f(A, x) + + def lagrange(self, x: float) -> float: + + def L(k, x): + + up = 1 + down = 1 + + for i in [x for x in range(self.data.X.shape[0]) if x != k]: + up = up * (x - self.data.X[i]) + + for i in [x for x in range(self.data.X.shape[0]) if x != k]: + down = down * (self.data.X[k] - self.data.X[i]) + + return up / down + + y = 0 + + for i in range(self.data.X.shape[0]): + y += self.data.Y[i] * L(i, x) + + return y + + def newton(self, x: float) -> float: + + d = np.array(np.zeros((self.data.shape[0], self.data.shape[0]))) + + d[0] = self.data.Y + + i = j = 0 + + while i < self.data.shape[0]: + + while j < (self.data.shape[0] - (i + 1)): + d[i + 1][j] = (d[i][j + 1] - d[i][j]) / (self.data.X[(i + 1) + j] - self.data.X[j]) + j += 1 + + i += 1 + j = 0 + + def f(x): + + y = d[0][0] + i = 0 + + while (i + 1) < self.data.shape[0]: + + mult = 1 + k = 0 + while k <= i: + mult = mult * (x - self.data.X[k]) + k += 1 + + y += d[i + 1][0] * mult + i += 1 + + return y + + self.f = f + + return f(x) + + def gregory(self, x: float) -> float: + + h = self.data.X[0] - self.data.X[1] + + d = np.array(np.zeros((self.data.shape[0], self.data.shape[0]))) + + d[0] = self.data.Y + + i = j = 0 + + while i < self.data.shape[0]: + + while j < (self.data.shape[0] - (i + 1)): + d[i + 1][j] = (d[i][j + 1] - d[i][j]) / ((i + 1) * h) + j += 1 + + i += 1 + j = 0 + + y = d[0][0] + i = 0 + + while (i + 1) < self.data.shape[0]: + + mult = 1 + k = 0 + while k <= i: + mult = mult * (x - self.data.X[k]) + k += 1 + + y += d[i + 1][0] * mult + i += 1 + + return y diff --git a/yoshi_otter/shared/__init__.py b/yoshi_otter/shared/__init__.py new file mode 100644 index 0000000..b8fa735 --- /dev/null +++ b/yoshi_otter/shared/__init__.py @@ -0,0 +1 @@ +from .invalid_function_signature import InvalidFunctionSignature diff --git a/yoshi_otter/shared/invalid_function_signature.py b/yoshi_otter/shared/invalid_function_signature.py new file mode 100644 index 0000000..168a568 --- /dev/null +++ b/yoshi_otter/shared/invalid_function_signature.py @@ -0,0 +1,2 @@ +class InvalidFunctionSignature(Exception): + pass \ No newline at end of file