반복적 해결


12

MATLAB을 사용하여 모든 시간 단계에서 를 풀어야하는 문제를 해결하고 있습니다 . 여기서 b 는 시간에 따라 바뀝니다. 지금은 MATLAB을 사용 하여이 작업을 수행하고 있습니다 .Ax=bbmldivide

x = A\b

필요한만큼 사전 계산을 수행 할 수있는 유연성이 있으므로보다 빠르고 정확한 방법이 있는지 궁금합니다 mldivide. 여기서 일반적으로 수행되는 작업은 무엇입니까? 모두 감사합니다!


1
의 구조에 대한 특정 지식이 있습니까? 예를 들어 대칭입니까? 긍정적 인 결정? 삼각형? 직교? A
Dominique

행렬 는 고밀도 정사각 행렬입니다. A
Doubt

3
당신이 다른 지식이없는 경우 L U의 대답에 설명 된대로 인수 분해는 아래의 최선의 방법이다. ALU
Dominique

답변:


14

당신이 할 수있는 가장 명백한 일은 사전 계산하는 것입니다

[L,U] = lu(A) ~ O (n ^ 3)

그럼 당신은 단지 계산

x = U \ (L \ b) ~ O (2 n ^ 2)

이것은 비용을 엄청나게 줄이고 더 빠르게 만듭니다. 정확도는 같습니다.


1
참고으로부터 문서 , L은 반드시 낮은 삼각형 없습니다. 이 답변은 직접 해결보다 빠를 것 같지만 L \ b 명령이 L을 올바른 순서로 해결하기에 충분히 똑똑해야합니다 (아마도 확실하지 않습니다) 설명서에서).
Godric Seer

네 맞습니다. L은 낮은 삼각 행렬과 순열 행렬의 곱입니다. 그러나 내가해야 할 모든 것이 이전 버전으로 대체된다는 것을 인식하지 못하면 저주받을 것입니다 L\b. 전문가라고 생각하는 사람들 이이 정확한 라인이 고성능 코드에서 사용되는 것을 보았 기 때문에.
Milind R

8
O(n2)

1
A

3
@BrianBorcher 내가 아는 한, 순열을 추적하는 가장 좋은 방법 [L,U,p] = lu(A,'vector'); x = U\(L\b(p));lu 문서의 예제 3을 참조하십시오 .
Stefano M

5

우리는이 주제에 대해 과학 컴퓨팅 과정에서 광범위한 컴퓨터 실습을 수행했습니다. "작은"계산을 위해 Matlab의 백 슬래시 연산자는 가능한 한 코드를 최대한 최적화하고 모든 행렬을 미리 재정렬 한 후에도 항상 다른 것보다 빠릅니다. .

실험실 지침 중 하나를 확인할 수 있습니다 . 귀하의 질문에 대한 답변은 4 페이지에 (짧게) 설명되어 있습니다.

이 주제에 대한 좋은 책은 예를 들어 Cheney에 의해 작성되었습니다 .


4

An×n Axi=bii=1mm

V = inv(A);
...
x = V*b;

O(n3)inv(A)O(n2)V*bm

>> n = 5000;
>> A = randn(n,n);
>> x = randn(n,1);
>> b = A*x;
>> rcond(A)
ans =
   1.3837e-06
>> tic, xm = A\b; toc
Elapsed time is 1.907102 seconds.
>> tic, [L,U] = lu(A); toc
Elapsed time is 1.818247 seconds.
>> tic, xl = U\(L\b); toc
Elapsed time is 0.399051 seconds.
>> tic, [L,U,p] = lu(A,'vector'); toc
Elapsed time is 1.581756 seconds.
>> tic, xp = U\(L\b(p)); toc
Elapsed time is 0.060203 seconds.
>> tic, V=inv(A); toc
Elapsed time is 7.614582 seconds.
>> tic, xv = V*b; toc     
Elapsed time is 0.011499 seconds.
>> [norm(xm-x), norm(xp-x), norm(xl-x), norm(xv-x)] ./ norm(x)
ans =
   1.0e-11 *
    0.1912    0.1912    0.1912    0.6183

A1LUm>125

일부 노트

안정성 및 오류 분석에 대해서는이 다른 답변에 대한 의견 , 특히 VictorLiu 의 의견을 참조하십시오 .

mn

타이밍은 상당히 일정한 UNIX로드 평균 5를 갖는 12 코어 컴퓨터에서 Matlab R2011b로 수행되었습니다. tic, toc3 개의 프로브 중 최상의 시간.


실제로, 삼각 솔버보다 행렬-벡터 곱셈에서 사용할 수있는 병렬 처리가 훨씬 많으므로 계산이 병렬 (멀티 코어 / GPU / 등 ...)로 수행되는 경우 훨씬 더 분명해야합니다.
Aron Ahmadia 2019

@AronAhmadia 나는 동의한다 : 연산 횟수만을 기반으로 한 손익 분기점 추정은 직렬 구현에만 의미가있다.
Stefano M

1
A 행렬이 희소 한 경우 사물이 크게 다를 수 있습니다. 역행렬은 일반적으로 밀도가 높지만 LU 요소는 일반적으로 합리적으로 희소하여 LU 방향으로 사물을 더 빨리 기울입니다.
Brian Borchers

1
A

1
inv(A)Ax=bbBA\B

2

이 질문을 살펴보면 , 대답 mldivide은 꽤 영리하며 Matlab이 해결하기 위해 사용하는 방법을 알 수있는 방법을 제안 A\b합니다. 최적화 옵션에 대한 힌트를 제공 할 수 있습니다.


0

백 슬래시를 사용하는 것은와 거의 inv(A)*B비슷합니다. 자유롭게 코딩한다면 후자가 더 직관적 일 수 있습니다. 설명은 Matlab 설명서를 확인해야하지만 거의 동일합니다 (계산 수행 방식이 다릅니다).

귀하의 질문에 대답하기 위해 백 슬래시는 일반적으로 괜찮지 만 질량 행렬의 속성에 따라 다릅니다.


1
수학적으로 inv (A) * b는 \와 동일하지만, 수치 적으로는 역을 형성하는 것이 실제로 덜 효율적이고 덜 정확합니다. 선형 대수학을 배우기 위해 노력한다면, 이것은 받아 들일 수 있지만, 역수를 형성 할 아주 좋은 이유가 필요하다고 주장합니다.
Godric Seer

그러나 왜 inv(A)혼자서보다 비싸기 때문에 왜 계산 A\b하겠습니까?
Dominique

7
@Godric : 최근 용지가 있음에 나와있는 INV (A)를 * b는 덜 정확하다는 "신화" ArXiv에 . 일반적으로 실제 역을 계산할 이유가 있다고 말하지 말고 그냥 말하십시오.
Victor Liu

3
@Dominique : 삼각 해법은 행렬-벡터 곱셈보다 병렬화가 훨씬 적으며, 정교한 사전 조건 반복 방법은 종종 하위 도메인에서 직접 방법을 사용합니다. 평행도를 향상시키기 위해 적당한 크기의 조밀 한 삼각 행렬의 역수를 명시 적으로 형성하는 것이 종종 유용합니다.
Jack Poulson

@VictorLiu : 기사 주셔서 감사합니다. 나는 정확성 진술 (inv (A)의 현명한 구현에 가장 이상적임)에 정정되었습니다.
Godric Seer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.