UNPKG

numerical-methods

Version:

A library that I made while studying Computer Science at UFPB. Documentation's available through TypeScript.

2 lines (1 loc) 4.95 kB
"use strict";var b=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var E=(o,s)=>b(o,"name",{value:s,configurable:!0});var v=(o,s)=>{for(var e in s)b(o,e,{get:s[e],enumerable:!0})},w=(o,s,e,i)=>{if(s&&typeof s=="object"||typeof s=="function")for(let n of P(s))!T.call(o,n)&&n!==e&&b(o,n,{get:()=>s[n],enumerable:!(i=L(s,n))||i.enumerable});return o};var F=o=>w(b({},"__esModule",{value:!0}),o);var V={};v(V,{doolittleLuDecomposition:()=>_,doolittleLuDecompositionParams:()=>G,gaussJacobi:()=>J,gaussMethodParams:()=>q,gaussSeidel:()=>D,gaussianElimination:()=>R,gaussianEliminationParams:()=>O,luComposition:()=>A,luCompositionParams:()=>N,spectralRadius:()=>M,spectralRadiusParams:()=>k});module.exports=F(V);var f=require("@hyoretsu/utils"),S=require("mathjs");var x="number[][]",N={l:x,u:x},A=E(({l:o,u:s})=>{if(o.length!==o[0].length||s.length!==s[0].length)throw new Error("Both matrices must be square");let e=[...o.map(n=>n.map(()=>0))];s[0].forEach((n,m)=>{e[0][m]=n});let i=[];return s.forEach((n,m)=>{n.forEach((a,t)=>{a!==0&&(i[t]===void 0&&(i[t]=[]),i[t].push(a))})}),e.slice(1).forEach((n,m)=>{m+=1;let a=[];o[m].forEach((t,u)=>{u<m&&a.push(t)}),n.forEach((t,u)=>{e[m][u]=i[u].reduce((h,r,c)=>c>m?h:c===m?h+r:h+a[c]*r,0)})}),e},"luComposition"),G={matrix:x},_=E(o=>{if(o.length!==o[0].length)throw new Error("Matrix must be square");let s=[...o.map((i,n)=>i.map((m,a)=>n===a?1:0))],e=[...o.map(i=>i.map(()=>0))];return o.forEach((i,n)=>{i.forEach((m,a)=>{if(a<n){if(a===0){s[n][0]=m/e[0][0];return}s[n][a]=(m-(0,f.range)(a).map(t=>s[n][t]*e[t][a]).reduce((t,u)=>u+t,0))/e[a][a];return}if(n===0){e[0][a]=o[0][a];return}e[n][a]=m-(0,f.range)(n).map(t=>s[n][t]*e[t][a]).reduce((t,u)=>u+t,0)})}),{result:{l:s,u:e}}},"doolittleLuDecomposition"),$={coefficients:x,independentTerms:"number[]"},O=$,R=E(({coefficients:o,independentTerms:s})=>{let e=[...o],i=[...s],n=[],m={},a=[];for(let t=0;t<o.length;t++){let u=t;for(let r=t;r<o.length;r++)r!==t&&e[r][t]>e[u][t]&&(u=r);(0,f.swap)(e,t,u),(0,f.swap)(i,t,u);for(let r of e){let c={coefficients:[],independentTerms:[]};for(let[l,d]of r.entries())c.independentTerms.push(d.toFixed(2)),c.independentTerms.push(i[l].toFixed(2));a.push(c)}let h=[];for(let r=t+1;r<o.length;r++)h[r]=e[r][t]/e[t][t];for(let r=t+1;r<o.length;r++){for(let c=t;c<o.length;c++)e[r][c]=(0,f.fixNumber)(e[r][c])-(0,f.fixNumber)(h[r]*e[t][c]);i[r]-=h[r]*i[t]}}for(let t=o.length-1;t>=0;t--){let u="";for(let h=0;h<o.length;h++)if(e[t][h]!==0){if(u===""){u=`${String.fromCharCode(97+t)} = () / ${e[t][h]}`;continue}u=u.replace(/\((.*)\)/,`($1-${e[t][h]}${String.fromCharCode(97+h)} + )`)}u=u.replace(/\((.*)\)/,`($1${i[t]})`),n.push(u),(0,S.evaluate)(u,m)}return{result:m,details:{transformedFuncs:n,steps:a}}},"gaussianElimination"),k={coefficients:x},M=E(o=>Math.max(...o.map((s,e)=>s.reduce((i,n)=>i+Math.abs(n),0)/Math.abs(s[e]))),"spectralRadius"),q={...$,precision:"number",options:{maxIterations:"number"}},J=E(({coefficients:o,independentTerms:s,precision:e,options:{maxIterations:i=Number.POSITIVE_INFINITY}={}})=>{e===0&&(e=1e-5);let n=[...o],m=[...s],a=[],t=0,u=s.length,h=m.map((c,l)=>[...(0,f.range)(u-1).map(d=>{let p=d>=l?d+1:d;return`${-n[l][p]/n[l][l]} * ${String.fromCharCode(97+p)} + `}),String(c/n[l][l])].join("")),r=m.map((c,l)=>c/n[l][l]);for(;;){let c=r;r=h.map((p,C)=>(0,S.evaluate)(p,r.reduce((g,I)=>(g[String.fromCharCode(97+Object.entries(g).length)]=I,g),{}))),t+=1;let l=Math.max(...r.map((p,C)=>Math.abs(p-c[C]))),d=l/Math.max(...r);if(a.push({iteration:t,currentGuess:c.map(p=>(0,f.fixNumber)(p)),nextGuess:r.map(p=>(0,f.fixNumber)(p)),absoluteError:(0,f.fixNumber)(l),relativeError:(0,f.fixNumber)(d)}),d<e||t>=i)break}return{result:{iterations:t,iterationFunc:h,spectralRadius:M(o),solution:r},details:a}},"gaussJacobi"),D=E(({coefficients:o,independentTerms:s,precision:e,options:{maxIterations:i=Number.POSITIVE_INFINITY}={}})=>{e===0&&(e=1e-5);let n=[...o],m=[...s],a=[],t=0,u=s.length,h=m.map((c,l)=>[...(0,f.range)(u-1).map(d=>{let p=d>=l?d+1:d;return`${-n[l][p]/n[l][l]} * ${String.fromCharCode(97+p)} + `}),String(c/n[l][l])].join("")),r=m.map(c=>0);for(;;){let c=[...r];h.forEach((p,C)=>{r[C]=(0,S.evaluate)(p,r.reduce((g,I)=>(g[String.fromCharCode(97+Object.entries(g).length)]=I,g),{}))}),t+=1;let l=Math.max(...r.map((p,C)=>Math.abs(p-c[C]))),d=l/Math.max(...r);if(a.push({iteration:t,currentGuess:c.map(p=>(0,f.fixNumber)(p)),nextGuess:r.map(p=>(0,f.fixNumber)(p)),absoluteError:(0,f.fixNumber)(l),relativeError:(0,f.fixNumber)(d)}),t>0&&d<e||t>=i)break}return{result:{iterations:t,iterationFunc:h,spectralRadius:M(o),solution:r},details:a}},"gaussSeidel");0&&(module.exports={doolittleLuDecomposition,doolittleLuDecompositionParams,gaussJacobi,gaussMethodParams,gaussSeidel,gaussianElimination,gaussianEliminationParams,luComposition,luCompositionParams,spectralRadius,spectralRadiusParams});