24小时热门版块排行榜    

查看: 1043  |  回复: 14
当前主题已经存档。

fspdlh

金虫 (正式写手)

★ ★ ★ ★
sunxiao(金币+4,VIP+0):谢谢参与,欢迎常来仿真编程版 4-9 23:13
我老是出点错,麻烦版主退10个金币给楼主吧,前面几个人也费了不少劲,呵呵
我把程序改了一下
function y=solveuv(u,v,N)
%Av-Bu=C
ind=floor(N/2);
A=u(ind+1:ind*2)-u(1:ind);
B=v(ind+1:ind*2)-v(1:ind);
C=v(1:ind).*u(ind+1:ind*2)-v(ind+1:ind*2).*u(1:ind);
%[A -B]*[v u]'=C
y=([A -B])\C;
% y(1)=u
% y(2)=v
y=[y(2) y(1)]';

>>  N=6;
u=[1 3 3 4 5 6]';
v=[1.5 2.5 3.5 4.5 5.5 6.5]';
y=solveuv(u,v,N)

y =

    5.0000
    5.5000
输出第一个值是u,第二个值是v,我只是根据你的式子来看的,没有考虑实际意思,感觉应该符合你的方程了。

第1个问题:
ind+1:ind不就是ind+1:ind+ind,也就是ind+1:ind*2吗,一样的。

第2个问题:
*是矩阵运算,.*是数组运算

比如:
>> a=[1 2 ;3 4]

a =

     1     2
     3     4

>> a.*a

ans =

     1     4
     9    16

>> a*a

ans =

     7    10
    15    22

随便找本MATLAB入门级的书先讲的都是这个
11楼2009-04-09 18:28:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sci_chris

金虫 (正式写手)

★ ★ ★ ★
sunxiao(金币+4,VIP+0):谢谢参与,欢迎常来仿真编程版 4-9 23:13
引用回帖:
求Matlab7编写程序代码,实现如下简单计算!

(uj-ui)v-(vj-vi)u=vi*uj-vj*ui     ( i=1,2,....N/2;  j=i+N/2 )

其中: ui,uj,vi,vj,N均为已知数值,求u,v?

按照楼主的意思,N应该是偶数了?如果是奇数,那N/2就不是一个整数,会导致u不能分成相同长度的向量,这个在matlab中是不能做的。

其实不用编成m文件进行调用,因为最小二乘可以表示成矩阵计算的,就是我在8楼说的:
b = inv(X'*X)*X'*y;

我们可以把算式(uj-ui)v-(vj-vi)u=vi*uj-vj*ui表示成矩阵相乘的形式(如果这个不是很清楚,建议看线性代数),(uj-ui)看成向量x1中的元素,(vj-vi)看成向量x2中的元素,vi*uj-vj*ui看成向量y中的元素,即把(uj-ui) (i=1:N/2)的结果放到一个向量中,同样把(vj-vi),vi*uj-vj*ui放到一个向量中,就像楼上做的:
x1=u(1:N/2)-u(N/2+1:N);
x2=-(v(N/2+1:N)-v(1:N/2));
y=v(1:N/2).*u(N/2+1:N)-v(N/2+1:N).*u(1:N/2);

然后:
X = [x1 x2];  % 自变量X
b = [u;v];      % 系数b

那整个方程就变成:
X*b = y;

根据最小二乘原理:
b = inv(X'*X)*X'*y;
b中的对应元素就是u,v;

这里我有点疑问:(uj-ui)v-(vj-vi)u=vi*uj-vj*ui中uj, ui, vj, vi是不是向量u, v 中的元素?那u, v变成已知的?如果u, v是未知数,建议不要写成u, v,要不然会和前面的ui, uj, vi, vj混淆,这个在线性代数中是很容易产生误会的~~

[ Last edited by sci_chris on 2009-4-10 at 08:29 ]
12楼2009-04-09 22:35:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

飞扬2282

荣誉版主 (著名写手)

引用回帖:
Originally posted by fspdlh at 2009-4-9 18:28:
我老是出点错,麻烦版主退10个金币给楼主吧,前面几个人也费了不少劲,呵呵
我把程序改了一下
function y=solveuv(u,v,N)
%Av-Bu=C
ind=floor(N/2);
A=u(ind+1:ind*2)-u(1:ind);
B=v(ind+1:ind*2)-v(1:ind) ...

谢谢fspdlh,之前没用过matlab,最近项目中涉及一些数学运算,所以没办法用matlab来编写公式。刚接触几天,很菜啊,呵呵。
金币版主就不用退了,谢谢帮助
13楼2009-04-10 10:26:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

飞扬2282

荣誉版主 (著名写手)

引用回帖:
Originally posted by sci_chris at 2009-4-9 22:35:


按照楼主的意思,N应该是偶数了?如果是奇数,那N/2就不是一个整数,会导致u不能分成相同长度的向量,这个在matlab中是不能做的。

其实不用编成m文件进行调用,因为最小二乘可以表示成矩阵计算的,就是我在 ...

谢谢sci_chris,麻烦版主给sci_chris加20个金币,从我这里扣吧,谢谢。


对,N的取值必须是偶数;uj, ui, vj, vi不是向量u, v 中的元素,写成u, v是容易误会

我也没有使用m文件进行调用,因为我还不知道怎么调用m文件

我是把fspdlh的代码修改了一下使用的,就是和你说的差不多:

N=6;
u=[1 3 3 4 5 6]';
v=[1.5 2.5 3.5 4.5 5.5 6.5]';

%Av-Bu=C
ind=floor(N/2);
A=u(ind+1:ind*2)-u(1:ind);
B=v(ind+1:ind*2)-v(1:ind);
C=v(1:ind).*u(ind+1:ind*2)-v(ind+1:ind*2).*u(1:ind);
% [A -B]*[v u]'=C
% y=[v u]';
y=([A -B])\C

y =

    5.5000
    5.0000

输出u是5.5,v是5(fspdlh,我觉得输出应该第一个值是v,第二个值是u吧?)
14楼2009-04-10 10:35:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

fspdlh

金虫 (正式写手)

呵呵,是的,我在11楼又加了一句
y=[y(2) y(1)]';
这样应该就没问题了
15楼2009-04-10 11:00:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 飞扬2282 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见