1/(z^2-1) のマクローリン展開と、z = 1 の周りを 0<|z-1|<2 でローラン展開したときの、近似値をチェックするために以下のようにCでコーディングしたのですが、ローラン展開の実部が怪しいです。関数の使い方に誤りがあるのでしょうか? コンパイラは gcc です。
ちなみに、十進BASICでは問題ありませんでした。
z = 0.5 + 0.02i で確認
1/(z^2-1)
-1.33168 -0.0354924i
-1 - z^2 - z^4 - z^6 - z^8
-1.33048 -0.03495i
1/(2*(z-1)) - 1/4 + (z-1)/8 - (z-1)^2/16 + (z-1)^3/32
-1.07262 -0.0366546i
↑がおかしい。
----------------------------------------------------------------
#include <stdio.h>
#include <complex.h>
// 複素数の表示
void cprint(double complex z)
{
//printf("%g% + gi\n", creal(z), cimag(z));
if (cimag(z) < 0)
printf("%g %gi\n", creal(z), cimag(z));
else
printf("%g + %gi\n", creal(z), cimag(z));
}
//FuncO(z) = 1/(z^2-1)
double complex FuncO(double complex z)
{
double complex dmy = 1/(z*z-1);
return dmy;
}
//cpow(x, y) = x^y
//マクローリン展開
//FuncM(z) = -1 - z^2 - z^4 - z^6 - z^8
double complex FuncM(double complex z)
{
double complex dmy = -1 - cpow(z,2) - cpow(z,4) - cpow(z,6) - cpow(z,8);
return dmy;
}
//z=1 (0<|z-1|<2)でローラン展開
//FuncR(z) = 1/(2*(z-1)) - 1/4 + (z-1)/8 - (z-1)^2/16 + (z-1)^3/32
double complex FuncR(double complex z)
{
double complex dmy = 1/(2*(z-1)) - 1/4 + (z-1)/8 - cpow(z-1,2)/16 - cpow(z-1,3)/32;
//double complex dmy = 1/(2*(z-1)) - 1/4 + (z-1)/8 - (z-1)*(z-1)/16 - (z-1)*(z-1)*(z-1)/32;
//としてもいっしょ
return dmy;
}
int main(void)
{
double complex a = 0.5 + 0.02 * I;
printf("1/(z^2-1)\n");
cprint(FuncO(a));
printf("-1 - z^2 - z^4 - z^6 - z^8\n");
cprint(FuncM(a));
printf("1/(2*(z-1)) - 1/4 + (z-1)/8 - (z-1)^2/16 + (z-1)^3/32\n");
cprint(FuncR(a));
return 0;
}
No.2ベストアンサー
- 回答日時:
ローラン展開についてはわかりませんが、
double complex dmy = 1/(2*(z-1)) - 1/4 + (z-1)/8 - cpow(z-1,2)/16 - cpow(z-1,3)/32;
を
double complex dmy = 1.0/(2.0*(z-1.0)) - 1.0/4.0 + (z-1.0)/8.0 - cpow(z-1.0,2.0)/16.0 - cpow(z-1.0,3.0)/32.0;
にしてみてください。
結果が
-1.07262 -0.0366546i
から
-1.32262 -0.0366546i
になります。
No.3
- 回答日時:
試してみようと手で打っていて気付いた. 1/4 って 0 じゃん....
なお「ローラン展開」の「ローラン」は Laurent だね.
No.1
- 回答日時:
^はべき乗じゃなくて、排他的論理和演算子かと。
回答ありがとうございます。
> ^はべき乗じゃなくて、排他的論理和演算子かと。
いや、それは表示用です。プログラムでのべき乗は複素数専用の cpow を使っています。
ローラン展開の数式は
1/(2(z-1)) - 1/4 + (z-1)/8 - (z-1)^2/16 + (z-1)^3/32
なので、プログラムでは
double complex dmy
= 1/(2*(z-1)) - 1/4 + (z-1)/8 - cpow(z-1,2)/16 - cpow(z-1,3)/32;
したのですけれど、期待された結果が出ないので、この使い方に問題はないのかということをお聞きしたいのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 「f(z)=1/(z^2-1)に関して ローラン展開を使う場合、マクローリン展開を使う場合、テイラー 3 2022/08/27 19:56
- 数学 複素積分 留数について質問です。 f(z)=1/((z-1)z(z+2)) に対して、閉曲線|z-1 4 2023/05/26 11:35
- 工学 画像はテイラー展開の公式です。 <マクローリン展開> f(z)=Σ_{n=-∞~∞}a(n)(z-a 1 2022/09/01 22:56
- 数学 tan(z)をローラン展開して tan(z)=-1/(z-π/2)+(1/3)(z-π/2)+… と 14 2023/01/17 10:33
- 数学 「<マクローリン展開> f(z)=Σ_{n=-∞~∞}a(n)(z-a)^n(ローラン展開の式)より 3 2022/09/01 08:19
- 数学 以前に 「画像のローラン展開は f(z)=1/(z^2-1) の z=-1の周り0<|z+1|<2で 23 2023/03/01 14:36
- 工学 Pythonの3Dグラフ表示に関する質問です。 1 2022/12/06 15:03
- 数学 テイラー展開版は以下であっているでしょうか? 間違いがある場合は、どこが間違っているか教えて下さい。 1 2022/09/01 23:44
- 数学 tan(z)を=/2を中心にローラン展開する上で、 z=π/2+0.001として、 tan(z)をロ 7 2023/03/03 06:24
- 数学 <テイラー展開> 「f(z)=Σ_{n=-∞~∞}a(n)(z-a)^n(ローラン展開の式)より、テ 3 2022/09/21 16:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
doubleの変数にintとintの割り...
-
プログラムでの数字につく”f”の...
-
c言語で、繰り返し文の中で、0....
-
float型とdouble型の変数の違い...
-
関数におけるif文とreturn文に...
-
C 開放してるのにエラー(doubl...
-
C言語で-23乗を取り扱うには
-
C言語の型による処理速度の違い
-
C言語を実行すると-infが出てき...
-
C言語 関数プロトタイプ宣言の...
-
difftime()について
-
2分法で方程式の複数の解を自...
-
ラグランジュの補間法のCプログ...
-
int とdoubleの比較
-
C言語 入力した数値の平均値の...
-
C言語のマクローリン展開ローラ...
-
C言語で表記についの質問です
-
π
-
C言語(プログラミング)関連の質...
-
2次方程式の解
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
C言語 関数プロトタイプ宣言の...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
関数におけるif文とreturn文に...
-
c言語のプログラミングについて...
-
2分法で方程式の複数の解を自...
-
-1.#IND00と出てしまうのですが...
-
doubleは常に%lfとするべきなのか
-
C言語のpow関数の不具合
-
C言語で-23乗を取り扱うには
-
C言語で台形公式を使った二重積...
-
Cで3乗根を求める方法
-
sin(x)の近似について
-
2次方程式の解を求めるプログ...
おすすめ情報
> double complex dmy = 1/(2*(z-1)) - 1/4 + (z-1)/8 - cpow(z-1,2)/16 - cpow(z-1,3)/32;
第5項が負になっていました。
double complex dmy = 1/(2*(z-1)) - 1/4 + (z-1)/8 - cpow(z-1,2)/16 + cpow(z-1,3)/32;
が正しいです。結果も少し違いますが、実部はやはりおかしいです。
1/(2*(z-1)) - 1/4 + (z-1)/8 - (z-1)^2/16 + (z-1)^3/32
-1.08039 -0.0357176i