首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变参数Matlab函数

变参数Matlab函数
EN

Stack Overflow用户
提问于 2013-06-05 01:49:44
回答 3查看 1.1K关注 0票数 2

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

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

代码语言:javascript
复制
y(x,a)=((xsin(ax-2))/(sqrt(1+(ax)^2)  
-π ≤ x ≤ π  
a={.5 1 1.5 2}  

方程必须用x矢量化,函数的输出是数组y,其维数与数组x相同。

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

到目前为止,我的职责是:

代码语言:javascript
复制
function [y] = part1(a,x)
y=((x*sin(a*x-2))/(sqrt(1+(a*x).^2)));
end

我不知道如何将它输出到解矩阵中

我的剧本是:

代码语言:javascript
复制
%%
clear,clc

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

for
    part1(x,a)
end

当我现在运行这个程序时,我会得到以下错误:

代码语言:javascript
复制
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));

编辑

我做了一些改变,但仍有一些我无法解决的错误。

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

函数

代码语言:javascript
复制
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

脚本

代码语言:javascript
复制
%%
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

错误

代码语言:javascript
复制
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));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-05 02:18:46

你快到了。注意你写的

代码语言:javascript
复制
function [y] = part1(a,x)

但在你的剧本里你把它叫做

代码语言:javascript
复制
part1(x,a)

所以你应该纠正一下。

有几件事突然出现在我面前:

  • 您从不将part1(x,a)的输出分配给任何东西。你被告知 对象的每个值使用解决方案矩阵的不同行将结果存储在解决矩阵中。
代码语言:javascript
复制
 What I take this to mean is that the 1st row corresponds to `part1()` evaluated for the 1st element of `a`. Since we're operating on `x` which is a vector, that row will have multiple columns. Your output is indeed a matrix. In your case, `length(-pi:0.1:pi) == 63`, therefore `size(y) == [4 63]`, where `y` is your output matrix.

  • 您的for循环是向后的。您被告知接受标量a和向量x。因此,您的脚本应该如下所示: A= 0.5:0.5:2;x= -pi:0.1:pi;for i=1:长度(A) y(i,:) = part1(x,a(i));结束

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

  • 您的函数需要更改为逐元素操作。注意,例如,x*sin(a*x-2)适用于标量x,而不是向量。这是因为x是向量,sin(a*x-2)也是向量(因为sin调用将逐元素操作,a是标量)。试图将两个向量相乘将导致误差,因为MATLAB将尝试执行矩阵乘法。通过用*替换.*来解决这个问题。这样,你将把这两个向量元素逐个乘以,这是明确的。您还需要将/更改为./

另外,感谢你在寻求帮助之前尝试做家庭作业。我们从学生那里得到了大量的问题,他们在把自己的工作扔给我们之前没有尝试过,所以我们经常使用MATLAB标签来帮助别人,而不是让人们做自己的工作,这令人耳目一新。

票数 0
EN

Stack Overflow用户

发布于 2013-06-05 06:37:35

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

代码语言:javascript
复制
a={0.5 1 1.5 2};

代码语言:javascript
复制
a=[0.5 1 1.5 2];

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

票数 2
EN

Stack Overflow用户

发布于 2013-06-05 22:54:45

终于把整件事解决了。

函数

代码语言:javascript
复制
function [y] = part1(x,a)

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

end

脚本

代码语言:javascript
复制
%%
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]  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16930300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档