numerical-methods
Version:
A library that I made while studying Computer Science at UFPB. Documentation's available through TypeScript.
2 lines (1 loc) • 14.6 kB
JavaScript
var V=Object.defineProperty;var ct=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var pt=Object.prototype.hasOwnProperty;var M=(o,e)=>V(o,"name",{value:e,configurable:!0});var ht=(o,e)=>{for(var t in e)V(o,t,{get:e[t],enumerable:!0})},dt=(o,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of mt(e))!pt.call(o,r)&&r!==t&&V(o,r,{get:()=>e[r],enumerable:!(a=ct(e,r))||a.enumerable});return o};var ft=o=>dt(V({},"__esModule",{value:!0}),o);var bt={};ht(bt,{allMethods:()=>xt,bisection:()=>G,categorizedMethods:()=>E,doolittleLuDecomposition:()=>tt,doolittleLuDecompositionParams:()=>j,falsePosition:()=>J,gaussJacobi:()=>st,gaussMethodParams:()=>X,gaussSeidel:()=>Y,gaussianElimination:()=>et,gaussianEliminationParams:()=>nt,integrationParams:()=>B,interpolationParams:()=>k,lagrangeInterpolation:()=>rt,luComposition:()=>W,luCompositionParams:()=>U,minMaxBisection:()=>y,minMaxBisectionParams:()=>A,newtonInterpolation:()=>at,newtonRaphson:()=>Z,newtonRaphsonParams:()=>q,paramsList:()=>Mt,secant:()=>H,simpsonRule13:()=>Q,spectralRadius:()=>F,spectralRadiusParams:()=>ot,trapezoidalRule:()=>K,vandermondeInterpolation:()=>it,zerosFunctionParams:()=>L});module.exports=ft(bt);var C=require("@hyoretsu/utils"),T=require("mathjs");var gt={conditionsWhitelist:"[boolean,boolean]",maxIterations:"number",origFunc:"string",relativeError:"number"},A={func:"string",interval:"[number,number]",target:'"min"|"max"',precision:"number",options:gt},y=M(({func:o,interval:[e,t],target:a,precision:r,options:{conditionsWhitelist:c=[!0,!0],maxIterations:l=Number.POSITIVE_INFINITY,origFunc:n,relativeError:s}={}})=>{r===0&&(r=1e-5);let d=[],i=-1,u={a:[0,0],b:[0,0]},m=typeof s=="number"&&s;for(;;){let p=[(0,T.evaluate)(o,{x:e}),(0,T.evaluate)(o,{x:t})],f=(e+t)/2,x=(0,T.evaluate)(o,{x:f});i+=1;let I=Math.abs(t-e),w=M(v=>{s&&(m||(v==="a"?m=e:m=t),s=Math.abs(f-m)/Math.abs(f)),v==="a"?e=f:t=f},"swapPoints"),N=a==="max"?1:-1;if(Math.sign(x-p[0])===N?(u.a=[e,(0,T.evaluate)(o,{x:(f+t)/2})],Math.sign(u.a[1]-x)===N&&w("a")):Math.sign(x-p[1])===N?(u.b=[t,(0,T.evaluate)(o,{x:(f+e)/2})],Math.sign(u.b[1]-x)===N&&w("b")):Math.sign(p[0]-p[1])===N?w("b"):Math.sign(p[1]-p[0])===N&&w("a"),d.push({iteration:i,interval:[(0,C.fixNumber)(e),(0,C.fixNumber)(t)],results:p.map(v=>(0,C.fixNumber)(v)),x:(0,C.fixNumber)(f),...n&&{y:(0,T.evaluate)(n,{x:f})},...s&&{relativeError:(0,C.fixNumber)(s)},condition1:(0,C.fixNumber)(I)}),!c[0]||I<r||i>=l)break}let h=Math.ceil((Math.log10(t-e)-Math.log10(r))/Math.log10(2));if(i<h&&l===Number.POSITIVE_INFINITY)throw new Error(`Something went wrong, less iterations than the minimum (${h}) were done.`);return{result:{iterations:i,interval:[e.toPrecision(21),t.toPrecision(21)]},details:d}},"minMaxBisection");var g=require("@hyoretsu/utils"),b=require("mathjs");var lt={bail:"boolean",conditionsWhitelist:"[boolean,boolean]",maxIterations:"number",origFunc:"string",relativeError:"boolean"},L={func:"string",interval:"[number,number]",precision:"number",options:lt},G=M(({func:o,interval:[e,t],precision:a,options:{bail:r=!1,conditionsWhitelist:c=[!0,!0],maxIterations:l=Number.POSITIVE_INFINITY,origFunc:n,relativeError:s}={}})=>{a===0&&(a=1e-5);let d=[],i=-1,u=typeof s=="number"&&s;for(;;){let h=[e,t],p=[(0,b.evaluate)(o,{x:e}),(0,b.evaluate)(o,{x:t})],f=(e+t)/2,x=(0,b.evaluate)(o,{x:f});i+=1;let I=Math.abs(t-e),w=Math.abs(x);Math.sign(x)===Math.sign(p[0])?(s&&!u&&(u=e),e=f):(s&&!u&&(u=t),t=f),d.push({iteration:i,interval:h.map(v=>(0,g.fixNumber)(v)),results:p.map(v=>(0,g.fixNumber)(v)),x:(0,g.fixNumber)(f),...n&&{y:(0,b.evaluate)(n,{x:f})},...s&&u!==0&&{relativeError:(0,g.fixNumber)(Math.abs(f-u)/Math.abs(f))},condition1:(0,g.fixNumber)(I),condition2:(0,g.fixNumber)(w)});let N=!c[0]||I<a,R=!c[1]||w<a;if(!r&&N&&R||r&&(N||R)||i>=l)break}let m=Math.ceil((Math.log10(t-e)-Math.log10(a))/Math.log10(2));if(i<m&&l===Number.POSITIVE_INFINITY)throw new Error(`Something went wrong, less iterations than the minimum (${m}) were done.`);return{result:{iterations:i,interval:[e.toPrecision(21),t.toPrecision(21)]},details:d}},"bisection"),J=M(({func:o,interval:[e,t],precision:a,options:{bail:r=!1,conditionsWhitelist:c=[!0,!0],maxIterations:l=Number.POSITIVE_INFINITY,origFunc:n,relativeError:s=!1}={}})=>{a===0&&(a=1e-5);let d=[],i=-1,u=typeof s=="number"&&s;for(;;){let m=[e,t],h=[(0,b.evaluate)(o,{x:e}),(0,b.evaluate)(o,{x:t})],p=(e*h[1]-t*h[0])/(h[1]-h[0]),f=(0,b.evaluate)(o,{x:p});i+=1;let x=Math.abs(t-e),I=Math.abs((0,b.evaluate)(o,{x:p}));switch(Math.sign(f)){case Math.sign(h[0]):s&&(u||(u=e),s=Math.abs(p-u)/Math.abs(p)),e=p;break;case Math.sign(h[1]):s&&(u||(u=t),s=Math.abs(p-u)/Math.abs(p)),t=p;break}d.push({iteration:i,interval:m.map(R=>(0,g.fixNumber)(R)),results:h.map(R=>(0,g.fixNumber)(R)),x:(0,g.fixNumber)(p),...n&&{y:(0,b.evaluate)(n,{x:p})},...s&&{relativeError:(0,g.fixNumber)(s)},condition1:(0,g.fixNumber)(x),condition2:(0,g.fixNumber)(I)});let w=!c[0]||x<a,N=!c[1]||I<a;if(!r&&w&&N||r&&(w||N)||i>=l)break}return{result:{iterations:i,interval:[e.toPrecision(21),t.toPrecision(21)]},details:d}},"falsePosition"),q={func:"string",initialX:"number",precision:"number",options:lt},Z=M(({func:o,initialX:e,precision:t,options:{bail:a=!1,conditionsWhitelist:r=[!0,!0],maxIterations:c=Number.POSITIVE_INFINITY,origFunc:l,relativeError:n=!1}={}})=>{t===0&&(t=1e-5);let s=[],d=-1,i=typeof n=="number"&&n;for(;;){let u=(0,b.evaluate)(o,{x:e}),m=(0,b.derivative)(o,"x").evaluate({x:e}),h=e;e-=(0,b.evaluate)(o,{x:e})/m,d+=1;let p=Math.abs(e-h),f=Math.abs((0,b.evaluate)(o,{x:e}));n&&(i||(i=h),n=Math.abs(e-i)/Math.abs(e)),s.push({iteration:d,prevX:(0,g.fixNumber)(h),prevY:(0,g.fixNumber)(u),diffY:(0,g.fixNumber)(m),x:(0,g.fixNumber)(e),...l&&{y:(0,b.evaluate)(l,{x:e})},...n&&{relativeError:(0,g.fixNumber)(n)},condition1:(0,g.fixNumber)(p),condition2:(0,g.fixNumber)(f)});let x=!r[0]||p<t,I=!r[1]||f<t;if(!a&&x&&I||a&&(x||I)||d>=c)break}return{result:{iterations:d,x:e.toPrecision(21)},details:s}},"newtonRaphson"),H=M(({func:o,interval:[e,t],precision:a,options:{bail:r=!1,conditionsWhitelist:c=[!0,!0],maxIterations:l=Number.POSITIVE_INFINITY,origFunc:n,relativeError:s=!1}={}})=>{a===0&&(a=1e-5);let d=[],i=-1,u=typeof s=="number"&&s;for(;;){let m=[(0,b.evaluate)(o,{x:e}),(0,b.evaluate)(o,{x:t})],h=(e*m[1]-t*m[0])/(m[1]-m[0]);i+=1;let p=Math.abs(h-e),f=Math.abs((0,b.evaluate)(o,{x:h}));s&&(u||(u=t),s=Math.abs(h-u)/Math.abs(h)),d.push({iteration:i,interval:[(0,g.fixNumber)(e),(0,g.fixNumber)(t)],results:m.map(w=>(0,g.fixNumber)(w)),x:(0,g.fixNumber)(h),...n&&{y:(0,b.evaluate)(n,{x:h})},...typeof s=="number"&&{relativeError:(0,g.fixNumber)(s)},condition1:(0,g.fixNumber)(p),condition2:(0,g.fixNumber)(f)});let x=!c[0]||p<a,I=!c[1]||f<a;if(!r&&x&&I||r&&(x||I)||i>=l)break;e=t,t=h}return{result:{iterations:i,interval:[e.toPrecision(21),t.toPrecision(21)]},details:d}},"secant");var O=require("@hyoretsu/utils"),S=require("mathjs");var B={func:"string",pointN:"number",x:"[number,number]"},K=M(({func:o,pointN:e,x:t})=>{let a=e-1,r=(t[1]-t[0])/a,l=[...(0,O.range)(t[0],t[1],r),t[1]].map(u=>(0,S.evaluate)(o,{x:u})),n=l.reduce((u,m,h)=>h===0||h===l.length-1?u+m:u+2*m,0);n*=r/2;let s=(0,S.derivative)((0,S.derivative)(o,"x"),"x").toString(),{result:{interval:[d]}}=y({func:s,interval:[t[0],t[1]],target:"max",precision:1e-12,options:{maxIterations:1e3}}),i=r**3/(12*a**2)*Math.abs((0,S.evaluate)(s,{x:d}));return{result:n,details:{error:i}}},"trapezoidalRule"),Q=M(({func:o,pointN:e,x:t})=>{let a=e-1,r=(t[1]-t[0])/a,l=[...(0,O.range)(t[0],t[1],r),t[1]].map(u=>(0,S.evaluate)(o,{x:u})),n=l.reduce((u,m,h)=>h===0||h===l.length-1?u+m:u+m*((0,O.isOdd)(h)?4:2),0);n*=r/3;let s=(0,S.derivative)((0,S.derivative)((0,S.derivative)((0,S.derivative)(o,"x"),"x"),"x"),"x").toString(),{result:{interval:[d]}}=y({func:s,interval:t,target:"max",precision:1e-12,options:{maxIterations:1e3}}),i=r**5/(180*a**2)*Math.abs((0,S.evaluate)(s,{x:d}));return{result:n,details:{error:i}}},"simpsonRule13");var $=require("@hyoretsu/utils"),z=require("mathjs");var P=require("@hyoretsu/utils"),D=require("mathjs");var _="number[][]",U={l:_,u:_},W=M(({l:o,u:e})=>{if(o.length!==o[0].length||e.length!==e[0].length)throw new Error("Both matrices must be square");let t=[...o.map(r=>r.map(()=>0))];e[0].forEach((r,c)=>{t[0][c]=r});let a=[];return e.forEach((r,c)=>{r.forEach((l,n)=>{l!==0&&(a[n]===void 0&&(a[n]=[]),a[n].push(l))})}),t.slice(1).forEach((r,c)=>{c+=1;let l=[];o[c].forEach((n,s)=>{s<c&&l.push(n)}),r.forEach((n,s)=>{t[c][s]=a[s].reduce((d,i,u)=>u>c?d:u===c?d+i:d+l[u]*i,0)})}),t},"luComposition"),j={matrix:_},tt=M(o=>{if(o.length!==o[0].length)throw new Error("Matrix must be square");let e=[...o.map((a,r)=>a.map((c,l)=>r===l?1:0))],t=[...o.map(a=>a.map(()=>0))];return o.forEach((a,r)=>{a.forEach((c,l)=>{if(l<r){if(l===0){e[r][0]=c/t[0][0];return}e[r][l]=(c-(0,P.range)(l).map(n=>e[r][n]*t[n][l]).reduce((n,s)=>s+n,0))/t[l][l];return}if(r===0){t[0][l]=o[0][l];return}t[r][l]=c-(0,P.range)(r).map(n=>e[r][n]*t[n][l]).reduce((n,s)=>s+n,0)})}),{result:{l:e,u:t}}},"doolittleLuDecomposition"),ut={coefficients:_,independentTerms:"number[]"},nt=ut,et=M(({coefficients:o,independentTerms:e})=>{let t=[...o],a=[...e],r=[],c={},l=[];for(let n=0;n<o.length;n++){let s=n;for(let i=n;i<o.length;i++)i!==n&&t[i][n]>t[s][n]&&(s=i);(0,P.swap)(t,n,s),(0,P.swap)(a,n,s);for(let i of t){let u={coefficients:[],independentTerms:[]};for(let[m,h]of i.entries())u.independentTerms.push(h.toFixed(2)),u.independentTerms.push(a[m].toFixed(2));l.push(u)}let d=[];for(let i=n+1;i<o.length;i++)d[i]=t[i][n]/t[n][n];for(let i=n+1;i<o.length;i++){for(let u=n;u<o.length;u++)t[i][u]=(0,P.fixNumber)(t[i][u])-(0,P.fixNumber)(d[i]*t[n][u]);a[i]-=d[i]*a[n]}}for(let n=o.length-1;n>=0;n--){let s="";for(let d=0;d<o.length;d++)if(t[n][d]!==0){if(s===""){s=`${String.fromCharCode(97+n)} = () / ${t[n][d]}`;continue}s=s.replace(/\((.*)\)/,`($1-${t[n][d]}${String.fromCharCode(97+d)} + )`)}s=s.replace(/\((.*)\)/,`($1${a[n]})`),r.push(s),(0,D.evaluate)(s,c)}return{result:c,details:{transformedFuncs:r,steps:l}}},"gaussianElimination"),ot={coefficients:_},F=M(o=>Math.max(...o.map((e,t)=>e.reduce((a,r)=>a+Math.abs(r),0)/Math.abs(e[t]))),"spectralRadius"),X={...ut,precision:"number",options:{maxIterations:"number"}},st=M(({coefficients:o,independentTerms:e,precision:t,options:{maxIterations:a=Number.POSITIVE_INFINITY}={}})=>{t===0&&(t=1e-5);let r=[...o],c=[...e],l=[],n=0,s=e.length,d=c.map((u,m)=>[...(0,P.range)(s-1).map(h=>{let p=h>=m?h+1:h;return`${-r[m][p]/r[m][m]} * ${String.fromCharCode(97+p)} + `}),String(u/r[m][m])].join("")),i=c.map((u,m)=>u/r[m][m]);for(;;){let u=i;i=d.map((p,f)=>(0,D.evaluate)(p,i.reduce((x,I)=>(x[String.fromCharCode(97+Object.entries(x).length)]=I,x),{}))),n+=1;let m=Math.max(...i.map((p,f)=>Math.abs(p-u[f]))),h=m/Math.max(...i);if(l.push({iteration:n,currentGuess:u.map(p=>(0,P.fixNumber)(p)),nextGuess:i.map(p=>(0,P.fixNumber)(p)),absoluteError:(0,P.fixNumber)(m),relativeError:(0,P.fixNumber)(h)}),h<t||n>=a)break}return{result:{iterations:n,iterationFunc:d,spectralRadius:F(o),solution:i},details:l}},"gaussJacobi"),Y=M(({coefficients:o,independentTerms:e,precision:t,options:{maxIterations:a=Number.POSITIVE_INFINITY}={}})=>{t===0&&(t=1e-5);let r=[...o],c=[...e],l=[],n=0,s=e.length,d=c.map((u,m)=>[...(0,P.range)(s-1).map(h=>{let p=h>=m?h+1:h;return`${-r[m][p]/r[m][m]} * ${String.fromCharCode(97+p)} + `}),String(u/r[m][m])].join("")),i=c.map(u=>0);for(;;){let u=[...i];d.forEach((p,f)=>{i[f]=(0,D.evaluate)(p,i.reduce((x,I)=>(x[String.fromCharCode(97+Object.entries(x).length)]=I,x),{}))}),n+=1;let m=Math.max(...i.map((p,f)=>Math.abs(p-u[f]))),h=m/Math.max(...i);if(l.push({iteration:n,currentGuess:u.map(p=>(0,P.fixNumber)(p)),nextGuess:i.map(p=>(0,P.fixNumber)(p)),absoluteError:(0,P.fixNumber)(m),relativeError:(0,P.fixNumber)(h)}),n>0&&h<t||n>=a)break}return{result:{iterations:n,iterationFunc:d,spectralRadius:F(o),solution:i},details:l}},"gaussSeidel");var k={x:"number[]",y:"number[]",targetX:"number|undefined"},rt=M(({x:o,y:e,targetX:t})=>{let a=e.map((r,c)=>{let l="",n=1;return o.forEach((s,d)=>{d!==c&&(l+=`(x ${Math.sign(o[d])===1?"-":"+"} ${Math.abs(o[d])})`,n*=o[c]-o[d])}),`${r} * (${l})/${(0,$.fixNumber)(n)}`}).reduce((r,c)=>r?`${r} + ${c}`:c,"");return{result:a,details:{...t&&{targetResult:(0,$.fixNumber)((0,z.evaluate)(a,{x:t}))}}}},"lagrangeInterpolation"),it=M(({x:o,y:e,targetX:t})=>{let a=o.length,{result:{solution:r}}=Y({coefficients:o.map((l,n)=>(0,$.range)(a).map(s=>l**s)),independentTerms:e,precision:1e-9}),c=r.reduce((l,n,s)=>s===0?String((0,$.fixNumber)(n)):`${l} ${Math.sign(n)===1?"+":"-"} ${Math.abs((0,$.fixNumber)(n))} * x^${s}`,"");return{result:c,details:{...t&&{targetResult:(0,$.fixNumber)((0,z.evaluate)(c,{x:t}))}}}},"vandermondeInterpolation"),at=M(({x:o,y:e,targetX:t})=>{let a=[];o.forEach((c,l)=>{if(l===0){a.push(e);return}let n=[];for(let s=0;s<o.length-l;s++)n.push((a[l-1][s+1]-a[l-1][s])/(o[l+s]-o[s]));a.push(n)});let r=a.map((c,l)=>{if(l===0)return String(c[0]);let n="";for(let s=0;s<l;s++)n+=`(x ${Math.sign(o[s])===1?"-":"+"} ${Math.abs(o[s])})`;return`${Math.sign(c[0])===1?"+":"-"} ${Math.abs(c[0])} * ${n}`}).join(" ");return{result:r,details:{dividedDifferences:a,...t&&{result:(0,z.evaluate)(r,{x:t})}}}},"newtonInterpolation");var E={custom:{minMaxBisection:y},functionZeros:{bisection:G,falsePosition:J,newtonRaphson:Z,secant:H},integration:{simpsonRule13:Q,trapezoidalRule:K},interpolation:{lagrangeInterpolation:rt,newtonInterpolation:at,vandermondeInterpolation:it},linearSystems:{doolittleLuDecomposition:tt,gaussJacobi:st,gaussSeidel:Y,gaussianElimination:et,luComposition:W,spectralRadius:F}},xt={...E.custom,...E.functionZeros,...E.integration,...E.interpolation,...E.linearSystems},Mt={bisection:L,doolittleLuDecomposition:j,falsePosition:L,gaussianElimination:nt,gaussJacobi:X,gaussSeidel:X,lagrangeInterpolation:k,luComposition:U,minMaxBisection:A,newtonInterpolation:k,newtonRaphson:q,secant:L,simpsonRule13:B,spectralRadius:ot,trapezoidalRule:B,vandermondeInterpolation:k};0&&(module.exports={allMethods,bisection,categorizedMethods,doolittleLuDecomposition,doolittleLuDecompositionParams,falsePosition,gaussJacobi,gaussMethodParams,gaussSeidel,gaussianElimination,gaussianEliminationParams,integrationParams,interpolationParams,lagrangeInterpolation,luComposition,luCompositionParams,minMaxBisection,minMaxBisectionParams,newtonInterpolation,newtonRaphson,newtonRaphsonParams,paramsList,secant,simpsonRule13,spectralRadius,spectralRadiusParams,trapezoidalRule,vandermondeInterpolation,zerosFunctionParams});
;