2

我需要帮助弄清楚如何编写以下问题。任何帮助将不胜感激!

创建一个函数,该函数将接受x( 1 by n) 的向量/数组输入和 的标量输入a,并产生由以下等式定义的输出:

y(x,a)=((xsin(ax-2))/(sqrt(1+(ax)^2)  
-π ≤ x ≤ π  
a={.5 1 1.5 2}  

方程必须向量化,x函数的输出是与数组y具有相同维度的数组x

编写一个脚本,调用这个函数来计算上面定义y(x,a)的范围x和参数的每个值a。结果应该存储在一个解决方案矩阵中,对于 的每个值使用不同的解决方案矩阵行a

到目前为止,对于我的功能,我有:

function [y] = part1(a,x)
y=((x*sin(a*x-2))/(sqrt(1+(a*x).^2)));
end

我不确定如何将其输出到解决方案矩阵中

对于我的脚本,我有:

%%
clear,clc

a={0.5 1 1.5 2};
x=-pi:0.1:pi;

for
    part1(x,a)
end

我现在运行它时遇到以下错误:

Undefined function 'mtimes' for input arguments of type 'cell'.

Error in part1 (line 4)
    y=((x*sin(a*x-2))/(sqrt(1+(a*x).^2)));

Error in labtest2 (line 8)
    y(i,:)=part1(x,a(i));

编辑

我进行了一些更改,但仍然遇到一些我无法解决的错误。

这是我的完整函数代码,后面是完整的脚本代码:

功能

function [y] = part1(x,a)

nx=numel(x);
na=numel(a);

y=((x.*sin(a.*x-2))./(sqrt(1+(a.*x).^2)));
size(y)=[nx na]
end

脚本

%%
clear,clc

a={0.5 1 1.5 2};
x=-pi:0.1:pi;

for i = 1:length(a)
  y(i,:)=part1(x,a(i));
end

错误

Undefined function 'times' for input arguments of type 'cell'.

Error in part1 (line 6)
    y=((x.*sin(a.*x-2))./(sqrt(1+(a.*x).^2)));

Error in labtest2 (line 8)
    y(i,:)=part1(x,a(i));
4

3 回答 3

2

你得到的原因Undefined function 'times' for input arguments of type 'cell'是因为你的变量a是一个单元格数组。您需要更改您的分配afrom

a={0.5 1 1.5 2};

a=[0.5 1 1.5 2];

这将使它只是一个普通的数组。或者,您需要使用元胞数组表示法来引用它:a{i}而不是a(i).

于 2013-06-05T06:37:35.177 回答
0

您快到了。请注意,您已经写了

function [y] = part1(a,x)

但是您在脚本中将其称为

part1(x,a)

所以你可能应该纠正那个。

我突然想到了几件事:

  • 你永远不会将输出分配part1(x,a)给任何东西。有人告诉你

    结果应该存储在一个解决方案矩阵中,对于 a 的每个值使用不同的解决方案矩阵行。

我的意思是第一行对应于part1()对 的第一个元素进行评估a。由于我们正在操作x哪个是向量,因此该行将有多个列。您的输出确实是一个矩阵。length(-pi:0.1:pi) == 63因此size(y) == [4 63],在您的情况下,y您的输出矩阵在哪里。

  • 你的for循环是倒退的。你被告知接受 scalara和 vector x。因此,您的脚本应该类似于:

    a = 0.5:0.5:2;
    x = -pi:0.1:pi;
    for i = 1:length(a)
        y(i,:) = part1(x, a(i));
    end
    

注意使用length:运算符。我想在 1 到length(a)(在本例中为length(a) == 4)之间进行迭代,以便可以将当前a(i)值用作输出矩阵 的索引y。中的:运算符y(i,:)表示“的i第 行和所有y将采用输出的值part1(x,a(i))。”

  • 您的功能需要针对逐个元素的操作进行更改。请注意,例如,x*sin(a*x-2)适用于标量x但不适用于向量。这是因为x是一个向量,sin(a*x-2)也是一个向量(因为sin调用将逐个元素操作并且a是一个标量)。尝试将两个向量相乘会导致错误,因为 MATLAB 会尝试执行矩阵乘法。通过替换来解决这个*问题.*。这样,您将逐个元素相乘这两个向量就很明确了。您还需要更改/./.

另一方面,感谢您在向 SO 寻求帮助之前尝试做功课。我们收到了大量来自学生的问题,他们在将其倾倒给我们之前从未尝试过自己的工作,因此令人耳目一新的是,我们 MATLAB 标签的常客得到实际帮助而不是告诉人们去做他们的工作自己的工作。

于 2013-06-05T02:18:46.813 回答
0

终于把整个事情搞定了。

功能

function [y] = part1(x,a)

    y=((x.*sin(a.*x - 2))./(sqrt(1 + (a.*x).^2)));

end

脚本

%%
clear all;
clc;
close all;

x=[-pi:.1:pi];
a=[.5:.5:2];

for i=1:length(a)
   y(i,:)=part1(x,a(i));

  plot(x,y)
end

Sol=[y]  
于 2013-06-05T22:54:45.520 回答