이 라이브러리는 인기있는 Math.js 라이브러리의 확장입니다. 간단한 수학적 기능의 적분을 찾을 수있는 integral
함수를 추가합니다. 또한 사용 된 통합 규칙에서도 유연하여 표준 규칙 대신 또는 표준 규칙 대신 사용자 정의 규칙을 사용할 수 있습니다.
이 소프트웨어는 여전히 베타로 간주되므로 버그 또는 거친 가장자리를 발견하면 문제를 제출하십시오!
패키지를 설치하려면 다음을 사용하십시오.
npm install mathjs-simple-integral
Math.js에 확장을 등록하려면 다음을 사용하십시오.
math . import ( require ( 'mathjs-simple-integral' ) ) ;
이것은 math.js에 함수 math.integral
추가합니다.
이 확장의 기본 사용은 매우 쉽습니다. Integrand ( Node
또는 문자열)와 통합 변수 ( SymbolNode
또는 String)를 제공합니다.
math . integral ( 'x^2' , 'x' ) ; // 'x ^ 3 / 3'
math . integral ( '1/x' , 'x' ) ; // 'log(abs(x))'
math . integral ( 'e^x' , 'x' ) ; // 'e^x'
math . integral ( 'cos(2*x+pi/6)' , 'x' ) ; // 'sin(2 * x + pi / 6) / 2'
integral
주어진 표현식의 적분을 찾을 수없는 경우 오류가 발생합니다.
math . integral ( 'e^(x^2)' ) ; // Error: Unable to find integral of "e ^ (x ^ 2)" with respect to "x"
기본적으로 통합 프로세스가 다루기 어려운 표현식을 생성 할 수 있으므로 출력에 대한 integral
실행 math.simplify
기본적으로 실행합니다. 그러나 선택적 세 번째 매개 false
로 simplify
Set로 설정된 options
객체를 통과시켜 integral
에서 원시적이고 단순화되지 않은 출력을 얻을 수 있습니다.
math . integral ( 'x^2' , 'x' , { simplify : false } ) ; // '1 / (2 + 1) * x ^ (2 + 1)'
math . integral ( '1/(2*x)' , 'x' , { simplify : false } ) ; // '2 ^ -1 * log(abs(x))'
이 구현에서, 통합 규칙은 매개 변수 (1) expr
로 취한 함수로 정의되며, 표현식은 통합 될 표현; (2) context
, 통합의 맥락; 및 (3) 하위 표현형 또는 재 작성 형태의 적분을 통합하려는 함수 인 subIntegral
. 그런 다음 통합 규칙은 계산 된 적분을 반환하거나 찾을 수없는 경우 null
반환합니다. 이미 구현 된 많은 표준 통합 외에도 ( math.integral.rules
에 위치) 사용자 정의 통합 규칙 세트를 지정할 수 있습니다.
예를 들어, 상위 불완전한 감마 기능을 나타내는 사용자 정의 함수 myUpperGamma
추가했다고 가정 해 봅시다. 이제 통합에 대한 지원을 추가하고, 특히이 규칙을 구현하고자합니다 : integral("myUpperGamma(s,x)", "x") = x*myUpperGamma(s,x) - myUpperGamma(s+1, x)
(여기에서 확인). 먼저이 규칙을 함수로 작성하겠습니다.
var myUpperGammaRule = function ( expr , context , subIntegral ) {
// Ensure we are trying to integrate a FunctionNode
if ( expr . type === "FunctionNode" ) {
// Ensure we are trying to integrate 'myUpperGamma' and that it has 2 arguments
if ( expr . name === "myUpperGamma" && expr . args . length === 2 ) {
// Ensure that the first argument is constant and the second one is
// the variable of integration
if ( context . isConstant ( expr . args [ 0 ] ) && expr . args [ 1 ] . equals ( context . variable ) ) {
// Yay, we matched 'myUpperGamma(s,x)', so we know the integral!
return new OperatorNode ( '-' , 'subtract' , [
new OperatorNode ( '*' , 'multiply' , [
context . variable ,
new FunctionNode ( 'myUpperGamma' , [
expr . args [ 0 ] ,
context . variable
] )
] ) ,
new FunctionNode ( 'myUpperGamma' , [
new OperatorNode ( '+' , 'add' , [
expr . args [ 0 ] ,
new ConstantNode ( 1 )
] ) ,
context . variable
] )
] ) ;
}
}
}
// Our rule, didn't apply :(
// return undefined
}
이제 맞춤형 통합 규칙이 있으므로 표준 규칙 목록에 추가 하고이 결합 된 목록을 사용하여 myUpperGamma
와 관련된 적분을 찾을 수 있습니다!
// Define our integration rules to include our custom rule
var options = { rules : math . integral . rules . concat ( [ myUpperGammaRule ] ) } ;
// Compute integrals of our function!
math . integral ( 'myUpperGamma(a,x)' , 'x' , options ) ;
// 'x*myUpperGamma(a,x) - myUpperGamma(a+1,x)'
math . integral ( 'myUpperGamma(a^2,x) + 13' , 'x' , options ) ;
// 'x*myUpperGamma(a^2,x) - myUpperGamma(a^2+1,x) + 13*x'
math . integral ( 'myUpperGamma(a,5*x+99)' , 'x' , options ) ;
// '((5*x+99) * myUpperGamma(a, 5*x+99) - myUpperGamma(a+1, 5*x+99)) / 5'
math . integral ( 'sqrt(myUpperGamma(a,x)) * sqrt(myUpperGamma(a,x))' , 'x' , options ) ;
// 'x*myUpperGamma(a,x) - myUpperGamma(a+1,x)'
이제 myUpperGamma
외에도 또 다른 사용자 정의 함수 mySum
있다고 가정합니다. add
와 마찬가지로 변수의 인수를 수락하고 인수를 함께 추가하지만 다른 비 방학적 기능 (예 : 평가 전에 각 인수를 기록하는 것과 같은 다른 비학자 기능도 수행합니다. 또는 그 주장 중 어느 것도 NaN
인지 확인하십시오). 이제 우리는 mySum
위의 적분의 선형성을 나타내는 통합기에 규칙을 추가 할 수 있습니다.
// integral(mySum(f(x), g(x), ...), x) = mySum(integral(f(x), x), integral(g(x), x), ...)
function mySumRule ( expr , context , subIntegral ) {
// Ensure we are trying to integrate a FunctionNode
if ( expr . type === "FunctionNode" ) {
// Ensure we are trying to integrate 'mySum'
if ( expr . name === "mySum" ) {
// Try to find integrals of all the terms in the sum
var termIntegrals = expr . args . map ( function ( term ) {
return subIntegral ( term , context , 'sum rule (mySum)' ) ;
} ) ;
// Only if all terms had integrals did we actually find an integral
if ( termIntegrals . every ( function ( termInt ) { return ! ! termInt ; } ) ) {
// Yay, we found the integral!
return new FunctionNode ( 'mySum' , termIntegrals ) ;
}
}
}
// return undefined
}
subIntegral
콜백을 사용하여 합의 모든 용어의 적분을 찾은 다음 모든 개별 항을 통합 할 수있는 경우에만 전체 mySum
표현식에 대한 적분을 반환합니다. 이제 두 가지 사용자 정의 규칙을 모두 사용하면 표현식을 mySum
및 myUpperGamma
와 통합 할 수 있습니다.
var options = { rules : math . integral . rules . concat ( [ myUpperGammaRule , mySumRule ] ) } ;
math . integral ( "mySum(3*x^2, x, 1/x, 1)" , "x" , options ) ;
// 'mySum(x^3, x^2/2, log(abs(x)), x)'
math . integral ( "mySum(2*x, myUpperGamma(a,x))" , "x" , options ) ;
// 'mySum(x^2, x*myUpperGamma(a,x) - myUpperGamma(a+1,x))'
옵션 객체는 true
로 설정된 경우 통합기에게 "작업 표시"를 지시하는 속성 debugPrint
가질 수 있습니다. 즉, 모든 단계와 특정 통합에 적용되는 모든 규칙이 콘솔에 인쇄됩니다. 예를 들어, integral("x^2 + sin(pi*x)", "x", {debugPrint: true})
콘솔에서 다음 출력을 생성합니다.
find integral of (x ^ 2) + (sin(pi * x)) dx
sum rule: find integral of x ^ 2 dx
Computed: (1 / (2 + 1)) * (x ^ (2 + 1))
sum rule: find integral of sin(pi * x) dx
linear substitution: find integral of sin(x) dx
Computed: -(cos(x))
Computed: (-(cos(pi * x))) / (pi * 1)
Computed: ((1 / (2 + 1)) * (x ^ (2 + 1))) + ((-(cos(pi * x))) / (pi * 1))
debugPrint
사용은 통합 규칙이 상호 작용하고 결합하여 적분을 찾는 방법을 배우는 좋은 방법이며, 맞춤형 통합 규칙을 개발할 때 매우 도움이됩니다.
이 구현에서 사용하는 통합 알고리즘은 중단 된 메모 화 된 패턴 매칭을 기반으로합니다. 각 패턴은 적분을 직접 계산하거나 통합을 통합하기 쉬운 표현식으로 다시 작성하거나 분할하려는 함수로 지정되어 그 안에 통합을 계산합니다. 통합기의 핵심은 규칙 무기입니다. 기본적으로 integral.rules
에 저장된 표준 통합 규칙 세트를 사용하지만 사용자 정의 규칙을 사용하는 것이 지원되지만 (사용자 정의 규칙 섹션 참조).
Integrands의 Memoization은 서브 표현의 일반적인 적분에 대한 속도를 제공 할뿐만 아니라 두 규칙이 서로를 취소하는 경우 무한 루프를 방지합니다 (예 : 하나가 지수를 곱한 경우, 다른 하나는 이러한 공통 요소를 결합합니다). 그러나이 알고리즘은 여전히 새롭고 고유 한 통합 및 모든 애플리케이션을 생성하는 무한한 횟수를 적용 할 수있는 규칙 (또는 여러 상호 작용 규칙)에 여전히 취약합니다. 이러한 규칙은 통합기가 무기한 (또는 모든 스택 공간이나 메모리가 소비 될 때까지)를 재발하게합니다.
이 접근법 (및이 패키지의 개발 초기 단계)의 단순성으로 인해이 현재 구현에는 많은 제한이 있습니다. 불완전한 목록을 제공하려면 현재 다음을 뒷받침 할 규칙이 없습니다.
2 * x * cos(x^2)
3 * x^2 * e^(x^3)
x * ln(x)
x^3 * e^x
cos(x) * tan(x)
과 같은 표현에 필요한대로 삼각형 단순화e ^ -(x^2)
통합하는 등 erf
사용합니다이러한 사례 중 하나 (또는 다른 Currenly 지원되지 않은 사례)를 처리하는 규칙을 구현하는 경우 풀 요청을 제출하십시오!
저작권 (C) 2018 Joel Hoover ([email protected])
Apache 라이센스, 버전 2.0 ( "라이센스")에 따라 라이센스가 부여되었습니다. 라이센스를 준수하는 것 외에는이 파일을 사용할 수 없습니다. 라이센스 사본을 얻을 수 있습니다
http://www.apache.org/licenses/license-2.0
해당 법률에 의해 요구되거나 서면에 동의하지 않는 한, 라이센스에 따라 배포 된 소프트웨어는 명시 적 또는 묵시적 보증 또는 조건없이 "그대로"기준으로 배포됩니다. 라이센스에 따른 특정 언어 통치 권한 및 제한 사항에 대한 라이센스를 참조하십시오.