具有不同参数的Matlab函数

时间:2013-06-05 01:49:45

标签: matlab function debugging

我需要帮助找出如何编码以下问题。任何帮助将不胜感激!

创建一个函数,该函数将x1 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));

3 个答案:

答案 0 :(得分:2)

您获得Undefined function 'times' for input arguments of type 'cell'的原因是因为您的变量a是一个单元格数组。您需要从

更改a的作业
a={0.5 1 1.5 2};

a=[0.5 1 1.5 2];

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

答案 1 :(得分:0)

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

function [y] = part1(a,x)

但您在脚本中将其称为

part1(x,a)

所以你应该纠正它。

我突然想到了一些事情:

  • 您永远不会将part1(x,a)的输出分配给任何内容。你被告知

      
        

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

  •     
    我的意思是第1行对应于part1()的{​​{1}}的第1个元素。由于我们在作为向量的a上运行,因此该行将具有多个列。你的输出确实是一个矩阵。在您的情况下,x,因此length(-pi:0.1:pi) == 63,其中size(y) == [4 63]是您的输出矩阵。

  
  • 您的y循环是向后的。您被告知接受标量for和向量a。因此,您的脚本应该是这样的:

    x

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

  • 您的功能需要更改element-by-element operations。请注意,例如,part1(x,a(i))适用于标量x*sin(a*x-2),但不适用于矢量。这是因为x是一个向量而x也是一个向量(因为sin(a*x-2)调用将逐个元素地运行,而sin是一个标量)。尝试将两个向量相乘会导致错误,因为MATLAB将尝试执行矩阵乘法。将a替换为*即可解决此问题。通过这种方式,您可以明确地将这两个向量逐元素相乘。您还需要将.*更改为/

另一方面,感谢您在向SO寻求帮助之前尝试做作业。我们已经收到了大量的学生提出的问题,这些学生在将它们倾倒在我们身上之前没有尝试做自己的工作,所以我们很清楚,MATLAB标签的常客会得到实际帮助,而不是告诉人们去做自己的工作。

答案 2 :(得分: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]