반복적 해결


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=1…mm

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

A−1LUm>125

일부 노트

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

m≪n

타이밍은 상당히 일정한 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.