このグラフの描画に関​するコードの誤ってる​点をおしえてください

2 views (last 30 days)
Yu Horiuchi
Yu Horiuchi on 23 Feb 2022
Commented: Yu Horiuchi on 24 Feb 2022
このコードの誤っている点を教えてください
以下のグラフを書きたいのです。
また、グラフの囲む部分に色を塗りたいのですがどうすれば良いでしょうか。
<コード>
fplot(@(x) 0.5*cos(2*pi*x)+7/2,[-2,2],"green")
hold on
fplot(@(x) x^4-x^2+6,[-1,1],"green")
hold on
fplot(@(x) 12/(x+1),[1,7],"blue")
hold on
fplot(@(x) 12/(-x+1),[-7,-1],"blue")
hold on
grid on
  4 Comments
Atsushi Ueno
Atsushi Ueno on 23 Feb 2022
Edited: Atsushi Ueno on 23 Feb 2022
>縦横のマス目のメモリの比を1:1にしたいのですが、どうすれば良いのですか?
>また、囲まれている領域に色を塗りたいのですが、どうすれば良いですか?
下記の様に、無名関数と値域を一旦変数に置きました。
wave1rng = [-2, 2]; wave1 = @(x) 0.5*cos(2*pi*x)+7/2;
wave2rng = [-1, 1]; wave2 = @(x) x.^4-x.^2+6;
Ridg1rng = [ 1, 7]; Ridg1 = @(x) 12./(x+1);
Ridg2rng = [-7,-1]; Ridg2 = @(x) 12./(-x+1);
%fplot(wave1, wave1rng, "green"); hold on;
%fplot(wave2, wave2rng, "green");
%fplot(Ridg1, Ridg1rng, "blue");
%fplot(Ridg2, Ridg2rng, "blue");
x = linspace(wave2rng(1),wave2rng(2)); area(x,wave2(x),'EdgeColor','g','FaceColor','g'); hold on;
x = linspace(Ridg1rng(1),Ridg1rng(2)); area(x,Ridg1(x),'EdgeColor','b','FaceColor','b');
x = linspace(Ridg2rng(1),Ridg2rng(2)); area(x,Ridg2(x),'EdgeColor','b','FaceColor','b');
x = linspace(wave1rng(1),wave1rng(2)); area(x,wave1(x),'EdgeColor','g','FaceColor','g');
pbaspect([2 1 1]); xlim([-7 7]); ylim([0 7]); grid on;
途中まで塗ってみましたがこんなんなってしまいます。
なぜこうなったのか、これで良いのか、NOであればどうすれば良いか
要件を定義してからarea関数のドキュメントを読んで考えてみてください。
Yu Horiuchi
Yu Horiuchi on 24 Feb 2022
とても納得しました。丁寧な解説ありがとうございます!!

Sign in to comment.

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 23 Feb 2022
% y = f(x) の形式の関数を指定します。関数は、ベクトルの入力引数を受け入れ、
% 同じサイズのベクトルの出力引数を返さなければなりません。
% 最高のパフォーマンスを得るには、行列演算子ではなく、配列演算子を使用します。
% たとえば、* (mtimes) ではなく .* (times) を使用します。
>このコードの誤っている点を教えてください
このコードは「正しい」とも「誤っている」ともいえます。事実、fplot関数はwarningを出しながらも動作しています。
数式の入力変数xがスカラ値の場合は問題なく演算出来ますが、xが複数の要素を持つ場合は一部の演算を行う事が出来ません。MATLAB(fplot関数)は賢いので、xに複数の要素を入力して高速に演算しようとしますが、複数の要素を一度に演算出来ない場合はスカラ値の入力を繰り返して対応し、それによりパフォーマンスが下がる可能性がある為warningを表示します。
for x = 1:3
x % xの値(スカラ値)を表示
x^4-x^2+6 % 問題なく演算出来る
end
x = 1
ans = 6
x = 2
ans = 18
x = 3
ans = 78
x = [1 2 3] % xに複数の要素を格納する事も出来る。これを数式に入力すれば一度に演算出来る
x = 1×3
1 2 3
x.^4-x.^2+6 % 演算子にドットを付けると問題なく演算出来る
ans = 1×3
6 18 78
x^4-x^2+6 % 演算子にドットが付いていないとエラーが出る
Error using ^ (line 52)
Incorrect dimensions for raising a matrix to a power. Check that the matrix is square and the power is a scalar. To perform elementwise matrix powers, use '.^'.
MATLABにおける「ドット付き演算子」の意味は「要素毎の演算」です。詳細は上記リンクを参照ください。
MATLABにおいてより良い形にするには、各種数式の演算子にドットを付けて行列演算に対応した数式にすべきです。
スカラ倍(0.5倍、2倍、π倍)する乗算演算子(*)に対しては、ドットを付けても付けなくても同じです。複数要素×複数要素の場合は乗算にもドットを付ける必要があります。
wave1 = @(x) 0.5*cos(2*pi*x)+7/2;
wave2 = @(x) x.^4-x.^2+6;
Ridg1 = @(x) 12./(x+1);
Ridg2 = @(x) 12./(-x+1);

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!