多項式を作る

  • こちら非線形偏微分方程式を扱っている
  • 非線形偏微分方程式では、偏微分が0になる点の周囲に保存量があるようなときに周期解を持つ(らしい)が、そのためには、非線形偏微分方程式を0とするような解を陽に表したい
  • 多項式の場合に限れば次のように作れる
  • n次多項式複素数解を許せばn個の解を持つから、それをc_j;j=1,2,...,nとすれば
  • f(x)=\prod_{j=1}^n (x-c_j)と表せる
  • 今、c_jのうち1個以上が実数であれば、この複素多項式f(x)は実数解を持つ
  • 今、微分積分をしたいので、次数ごとの係数も知りたい(f(x)=\sum_{i=0}^n z_i x^iという表記でのz_iのこと)
  • この係数は複素数になっている
  • さて、関数としては係数がすべて実数であるような、実数係数関数がほしいとする
  • z_iの実部をRe(z_i)と表せば、fR(x)=\sum_{i=0}^n Re(z_i) x^iはもちろん実数係数関数であって、fR(x=c_j\in \mathbf{R})=0が満足されるので、fR(x)=0は次数がnで、実数解を持つ実係数関数となっている
  • Rで確かめてみる
# 虚数解のベクトルxsから変数の次数別の複素係数を求める関数
mypoly2<-function(xs){
	library(gtools)
	n<-length(xs)
	ret<-rep(0,n+1)
	for(i in 1:n){
		cmb<-combinations(n,length(xs)-i+1)
		print(cmb)
		for(j in 1:length(cmb[,1])){
			tmp<-1
			for(k in cmb[j,]){
				tmp<-tmp*(-xs[k])
			}
			ret[i]<-ret[i]+tmp
		}
	}
	ret[length(ret)]<-1
	ret
}
k<-5 # 次数
# 次数の数だけ複素数解
xs<-complex(real=rnorm(k),imaginary=rnorm(k))
# 一部は実数解
xs[1:3]<-Re(xs[1:3])
# 複素係数
ks<-mypoly2(xs)
# 実係数
ksRe<-Re(ks)
# 任意の実数について計算
x<-rnorm(1)
# 複素係数関数
print(sum(ks*x^(0:length(xs))))
# 実係数関数 実部は一緒
print(sum(ksRe*x^(0:length(xs))))
# 検算
tmp<-1
for(i in 1:length(xs)){
	tmp<-tmp*(x-xs[i])
}
print(tmp)
# 任意の複素数について計算
x<-complex(real=rnorm(1),imaginary=rnorm(1))
# 複素係数関数
print(sum(ks*x^(0:length(xs))))
# 実係数関数 異なる
print(sum(ksRe*x^(0:length(xs))))
# 変数の実部だけを用いても(もちろん)異なる
print(sum(ksRe*Re(x)^(0:length(xs))))
# 検算
tmp<-1
for(i in 1:length(xs)){
	tmp<-tmp*(x-xs[i])
}
print(tmp)
# 複素解ごとに関数の値を計算
for(i in 1:length(xs)){
	x<-xs[i]
# 複素係数関数
print(sum(ks*x^(0:length(xs))))
# 実係数関数
print(sum(ksRe*x^(0:length(xs))))
# 検算
tmp<-1
for(i in 1:length(xs)){
	tmp<-tmp*(x-xs[i])
}
print(tmp)
}