質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2942閲覧

def文中の制御構文(if, for, whileなど)の書き方がわからない。

Assalam_Aziz

総合スコア18

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/07/27 07:06

前提・実現したいこと

NumPyとMatplotlibを用いてブラッグの法則 (nλ = 2dsinθ) の整数nを変化させたときの角度θの値を計算・描画しています。

アークサインの定義域1を超えない範囲、つまり関数f(n) = np.arcsin(nl1/a*1/2)が1を超えないように制御したいのですが、上手くコードを書くことできません。

大変申し訳ないのですが、丁寧に教えていただけると助かります。

該当のソースコード

Python

import numpy as np import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') #パラメータ値の設定 l = 0.3 a = 5.4 n = np.arange(101) #nの値を変化させたときのアークサインの計算 def f(n): return np.arcsin(n*l*1/a*1/2) #ラジアンを角度に変換 deg = np.rad2deg(f(n)) #描画 plt.plot(n,deg)

試したこと

サイン角の定義域を超えると警告文が出るので、制御するために"import warnings
warnings.filterwarnings('ignore')" を追加しました。

for, if文を用いてnp.arcsin(nl1/a*1/2)が1を超えた場合を制御しようと試みましたが、outside loopになってしまいました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

nl1/a*1/2が1を超えないように、でしょうか。

超えたらどうするのですか?

エラーを出す?
止める?
スキップする?


一回受け止めてから判定してはいかがでしょう?
np.anyが必要かどうかはnがnp.arrayかどうかによります。
ただの数なら必要ないです。

python

1def f(n): 2 ans = np.arcsin(n*l*1/a*1/2) 3 if np.any(ns.isnan(ans)): 4 raise 5 else: 6 return ans

投稿2018/07/27 09:00

編集2018/07/27 12:24
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Assalam_Aziz

2018/07/27 09:17

回答ありがとうございます。整数nを増やしていくと、n = 35付近でf(n)の値が1を超えます。1を超えた地点で停止するコードを作成したいと考えています。そこでdef文の中で何らかの制御構文を導入しようと試みたのですが、上手く実装することができない、というのが今の現状です。
mkgrei

2018/07/27 09:22

疑問としては、 n = np.arange(101) で101ではなく35にすればよいのでは?
Assalam_Aziz

2018/07/27 10:39

回答ありがとうございます。調べてみたところnを増やしていくとn=36のときに角度θが90°となり最大値を取りました。nを101にした理由は計算する段階ではnとθが取りうる最大値がわからなかったからです。今回は範囲が限られているのでリストの中で絞ることが出来ましたが、もっとデータが大きくなった場合では厳しいと思います。 また、θは回折角なのでn > 36でNaNになります。なので"関数f(n) = np.arcsin(n*l*1/a*1/2)が1を超えないように"と書きましたが、すみませんこれは誤りです。正しくは"nを増やしていった時の角度が90°を超えないように"です。なのでdeg = np.rad2deg(f(n))を書き換えて、0から90°の範囲におけるθを集めるコードを書く必要がありますと思います。
mkgrei

2018/07/27 12:25

回答に追記しました。
Assalam_Aziz

2018/07/27 22:31

```Python import numpy as np import matplotlib.pyplot as plt %matplotlib inline l = 0.3 a = 5.4 n = np.arange(1, 37) def f(n): ans = np.arcsin(n*l*1/a*1/2) if np.any(ns.isnan(ans)): raise else: return ans deg = np.rad2deg(f(n)) plt.plot(n,deg) plt.show() ``` 回答ありがとうございます。上記のコードを実装してみたところ、エラーは検出されなかったのですが、今度はグラフが表示されなくなってしまいました。この問題も解決したいのですが、質問の趣旨とは離れてしまうのでここで保留とさせていただきます。丁寧なご回答ありがとうございました。また別の機会に質問したいと思っています。
mkgrei

2018/07/28 03:34

たぶん配列全体のどこかで、nanがあって、その結果returnに入ってない可能性があります。 x = x[~numpy.isnan(x)] これで部分的に取り除くことがでいます。 また、取り除くことによって、nとdegの次元が変わるので、そこをどうにか処理する必要があります。 b = ~numpy.isnan(deg) deg = deg[b] n = n[b]
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問