-1

나는 계속 분수를 포함하는 방정식을 가지고 있습니다. 방정식의 매개 변수 인 모든 R에 대해이 방정식의 특정 근원을 찾고 싶습니다. MATLAB로 다항식으로이 계속 분수 코드를 어떻게 최적화 할 수 있습니까?

  • 는 식의 모든 뿌리는
  • 그리고 마지막으로 내가 '루트 검색이 polynomium에게
  • 컴퓨팅을 단순화

    • 입력 :이 내가 들어

      관심이있는 사람

    내가 가진 문제는 높은 R은 더 높은 정확도를 요구하므로 더 많은 레벨이 필요하다는 것입니다. 계속 분수의, 그러나 나의 컴퓨터는 다량을 계산할 수 없다 (나는 i7 제 3 세대 12 기가 바이트 램 노트북 2 개의 코어를 가지고있다).

    이 방정식을 계산하기 위해 병렬 컴퓨팅 또는 GPU 컴퓨팅을 사용할 수 있습니까? 내 코드를 최적화 할 수 있습니까? 또는 다른 컴퓨팅 프로그램을 사용하여 이러한 루트를 계산할 수 있습니다.

    %% 
    clear; close all; clc; 
    %% 
    syms R; 
    Z=1; E=1; P1=sqrt(2*E); 
    m=0; 
    c=m+1; d=c; a=-1i*Z/P1+m+1; t=-2*1i*P1*R; 
    n=20; 
    %A, B, C koeficientebis gansazgvra 
    for k=0:n 
        A(k+1)=(k+1)*(k+c); 
        B(k+1)=-k*(k-1+t+c+d); 
        C(k+1)=t*(k-1+a); 
    end 
    syms x; 
    for i=1:n 
        P(i)=x; 
        Q(i)=x; 
    end 
    % gantolebis chawera 
    for k=1:n-2 
        if k==1 
         P(k)=(-C(k+1)); 
         Q(k)=(B(k+1)-x); 
        elseif k==2 
         P(k)=-C(k)*(B(k+1)-x); 
         Q(k)=(B(k)-x)*(B(k+1)-x)+(-A(k)*C(k+1)); 
        else 
        P(k)=(B(k+1)-x)*P(k-1)+(-A(k)*C(k+1))*P(k-2); 
        Q(k)=(B(k+1)-x)*Q(k-1)+(-A(k)*C(k+1))*Q(k-2); 
        end 
    end 
        eqn(x)=-x*Q(n-2)+P(n-2); 
        eqn=simplify(eqn); 
        eqn(R)=eqn; 
        R=0.1:0.1:9; 
        R=double(R); 
        eqn=eqn(R); 
        ros(:,1)=R; 
        for i=1:length(R) 
         coef(i,:)=flip(double(coeffs(eqn(i)))); 
         ros(i,2:n)=roots(coef(i,:)); 
        end 
    for i=0:n-1 
        plot(R,real(ros(:,n-i)),R,imag(ros(:,n-i)));hold on; 
    end 
    

    내 컴퓨터는 n = 35 일 때 계산할 수 있으며 시간이 조금 걸릴 수 있습니다. 하지만 50 ~ 60 세가 필요합니다.

    편집 :

    eqn=simplify(eqn); 
    
  • +0

    여기서 상징적 인 수학의 요점은 무엇입니까? – Bernhard

    +0

    'roots()'함수는 근원을 계산하기 위해 다항식 계수를 취합니다. 내 식은 단순화가 필요했기 때문에 상징적 인 표현을 사용했습니다. 나는'solve()'를 시도했지만, 그것은 나에게 무언가의 뿌리를주고 나는 숫자가 필요하다. –

    답변

    0

    은 가능하면 피하는 루프에 의해 코드를 최적화 해보십시오 : 문제는 동안 램 사용을 것 같다. 당신이로 쓸 수 따라서

    %A, B, C koeficientebis gansazgvra 
    for k=0:n 
        A(k+1)=(k+1)*(k+c); 
        B(k+1)=-k*(k-1+t+c+d); 
        C(k+1)=t*(k-1+a); 
    end 
    

    : 예를 A, B 및 C에 대한 가 서로에 의존하지 않는 내가 곱셈에 점을 추가 한

    k=0:n; 
    A(k+1)=(k+1).*(k+c); 
    B(k+1)=-k.*(k-1+t+c+d); 
    C(k+1)=t.*(k-1+a); 
    

    주 (. *)에 행렬 곱셈을 피하십시오.

    +0

    응답 해 주셔서 감사합니다. 그러나 주된 문제는 'n'이 클 때 방정식을 단순화하는 데에 시간이 많이 걸리고 내 숫자로 충분하지 않습니다. –

    +0

    그래서 "eqn = simplify (eqn);" 문제는 무엇입니까? 그런 다음 코드의 초기 단계에서 단순화 한 다음 다시 간단히 해보십시오. – Solstad