このグラフの描画に関するコードの誤ってる点をおしえてください
1 次查看(过去 30 天)
显示 更早的评论
このコードの誤っている点を教えてください
以下のグラフを書きたいのです。
また、グラフの囲む部分に色を塗りたいのですがどうすれば良いでしょうか。
<コード>
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 个评论
Atsushi Ueno
2022-2-23
编辑:Atsushi Ueno
2022-2-23
>縦横のマス目のメモリの比を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関数のドキュメントを読んで考えてみてください。
采纳的回答
Atsushi Ueno
2022-2-23
% 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 2 3] % xに複数の要素を格納する事も出来る。これを数式に入力すれば一度に演算出来る
x.^4-x.^2+6 % 演算子にドットを付けると問題なく演算出来る
x^4-x^2+6 % 演算子にドットが付いていないとエラーが出る
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);
0 个评论
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 ARM Cortex-M Processors 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!