私は、連続分数を含む方程式を持っています。私は方程式のパラメータであるすべてのRについてこの方程式の特定の根を見つけたいと思っています。この私のためにコードを最適化するにはどうすればよいですか?
:
- 入力多項式として、この連分数MATLAB へ
- は
- 計算に表現
- のすべての根をこのpolynomiumを簡素化し、最終的に私は「ルートを検索します興味があります。
私が問題にしているのは、高いRは高い精度を必要とするためです私のコンピュータはそれほど計算できません(私は第3世代の12GBラムラップトップ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になるためにはnのようにする必要があります。
EDIT:可能な場合は、ループを回避することにより、コードを最適化してみ
eqn=simplify(eqn);
ここで象徴的な数学のポイントは何ですか? – Bernhard
関数 'roots()'は根を計算するために多項式の係数を取ります。私の方程式はそれを単純化する必要があり、そのため記号表現を使用しました。私は 'solve()'を試みましたが、それは私に何かの根を与え、私は数が必要です。 –