声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2659|回复: 15

[编程技巧] 求助方程求解与数组定义的问题

[复制链接]
发表于 2009-3-23 10:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
for i=1:n
   Mk(i)=L(i)*cos(m(i)); Ml(i)=L(i)*sin(m(i));      %m是一个转角角度数的未知数组%
end
e=cumsum(Mk); f=cumsum(Ml);
MK(1)=e(n)-x(n+1);            %x(n+1),y(n+1)前面已求得。(这里可以取任意值,不影响结果)%
MK(2)=f(n)-y(n+1) ;                %约束方程(总体法)%
syms m t
R3=input('请输入已知转角数组l=')  %已知的转角数组是一个关于变量t的多项式,数组的维数任意%
U=R3; o=length(U);                        %将上面输入的已知数组覆盖m的前几项,数组m后面的数组不变%
k=o+1; W=m(k:end); s=[U W] ;
u=diff(U,t); a=diff(U,t,2); w=diff(W,t); wa=diff(W,t,2);               %对t求导,求出速度, 加速度%
R4=input('请输入初始时刻t0='); t0=R4;
R5=input('请输入终止时刻tend='); tend=R5;
T=[t0 tend];
R6=input('请输入离算次数N='); N=R6;
h=(tend-t0)/N; t(1)=t0; t(N+1)=tend ;                %输入时间段,且将其均分为若干个时间点%
for i=1:N-1, t(i+1)=t(i)+h; end
for i=1:N+1                                          %求解各时间点的速度与加速度%
   m(1:o)=subs(U,t(i)); uu(i,:)=subs(u,t(i)); ua(i,:)=subs(a,t(i));
end

    m这个未知的数组我定义不出来,后面的求导等都不好做了.输入时间t后经过离散可以求出各时刻m(1)的值,然后回带到约束方程中运用迭代法可以解出m其他元素的值然后可以往后面带求出个时刻的速度与加速度。可是如何迭代求解我做不出来。还请各位大侠帮帮忙!!小弟在此谢过!!

[ 本帖最后由 ChaChing 于 2009-5-2 10:00 编辑 ]
回复
分享到:

使用道具 举报

发表于 2009-3-23 11:09 | 显示全部楼层
個人水平有限, 建議樓主看下本版規則並加強發問題方式!
 楼主| 发表于 2009-3-23 12:05 | 显示全部楼层

救助:非线性方程组求解

function F=myfun6(m)
R=input('请输入杆件的长度矩阵L='); L=R; n=length(L); x(n+1)=6;y(n+1)=0;
for i=1:n;
    Mk(i)=L(i)*cos(m(i)); Ml(i)=L(i)*sin(m(i));
end
e=cumsum(Mk); f=cumsum(Ml); MK(1)=e(n)-x(n+1); MK(2)=f(n)-y(n+1);
F=[MK]

出错总是说m没定义。可以怎么修改一下呀?泣谢啦!!

[ 本帖最后由 ChaChing 于 2009-5-2 10:02 编辑 ]
发表于 2009-3-23 13:26 | 显示全部楼层

回复 板凳 liushuiwuxin 的帖子

LZ怎呼叫myfun6? 会不会没定义m
 楼主| 发表于 2009-3-23 16:45 | 显示全部楼层
在命令窗口直接用fsolve应该就可以解出这个方程。就是[m]=fsove(@myfun6,m0)。m是没有定义的,我就是不知道怎么定义这个m
发表于 2009-3-23 18:38 | 显示全部楼层
函数不是楼主自己写的吗?
楼主自己都不知道输入什麽, 别人怎猜!? 无言
 楼主| 发表于 2009-3-23 19:32 | 显示全部楼层
m是一个由未知数构成的数组,m里的元素是未知数,这个函数的目的就是算出m里各元素的值。m的维数是等于n的   关键在于我不晓得由未知数构成的m数组怎么定义
我本是想将m定义成[a1,a2, a3, ...,an]的,可是我不会这样定义,有没有什么好的方法?或其他思路?

[ 本帖最后由 ChaChing 于 2009-3-23 21:46 编辑 ]
 楼主| 发表于 2009-3-25 22:21 | 显示全部楼层

求函数的间接递归调用例子

那位大哥有函数的间接递归调用例子或方法呀?能不能给个例子学习一下?谢谢啦!!另外还请各位大侠们帮帮忙看如何修改一下下面的一个函数以达到预期目的。谢谢啦!
function F=myfun8(m)
%求解以m(i)为未知数的非线性方程组MK的数值解%
R=input('请输入杆件长度矩阵L=');
L=R; %L是一个由用户输入的变量,其长度是任意的。入用户可以输入L=[10 10 10 10],也可输入L=[10 10]等%
n=length(L); x(n+1)=6; y(n+1)=0;
for i=1:n
    Mk(i)=L(i)*cos(m(i)); Ml(i)=L(i)*sin(m(i));
end
e=cumsum(Mk); f=cumsum(Ml);
MK(1)=e(n)-x(n+1); MK(2)=f(n)-y(n+1);
我的主要目的是求解未知量m的数值解。那位大哥能够帮忙,小弟在此泣谢啦!!!

[ 本帖最后由 ChaChing 于 2009-3-26 21:57 编辑 ]
 楼主| 发表于 2009-3-26 14:20 | 显示全部楼层

帮忙看一下这个函数那里错了

那位高手能够帮帮忙啊,看看我这个函数为什么解出的结果是0呀?是哪一步调用错了呀?多谢啦!!
function mnpql(L,n)
L=input('请输入杆件长度向量L='); n=length(L); y2=mnp(L); m0(1:n)=[1];
options=optimset('Display','iter'); m=fsolve(@myfun000,m0,options)

function L=mnp(l)
L=l;n=length(L);m(1:n)=rand;
for i=1:n, Mk(i)=L(i)*cos(m(i)); Ml(i)=L(i)*sin(m(i)); end
e=cumsum(Mk); f=cumsum(Ml); x(n+1)=6; y(n+1)=0;
MK(1)=e(n)-x(n+1); MK(2)=f(n)-y(n+1); f=[MK];

function F=myfun000(f);
F=f;

[ 本帖最后由 ChaChing 于 2009-5-2 10:19 编辑 ]
发表于 2009-3-26 14:47 | 显示全部楼层
错的地方太多了,楼主自己先把程序解释一下,看逻辑上有没有问题
 楼主| 发表于 2009-3-26 15:24 | 显示全部楼层
function mnpql(L)
%L是一个可变向量,由用户自己通过键盘输入,可取任意值%
L=input('请输入杆件长度向量L=');y2=mnp(L);%将赋值给y2,以便后面下面子函数的传递%
m0(1:n)=[1];%给m0赋初值,迭代求解下面的非线性方程F%
options=optimset('Display','iter'); m=fsolve(@myfun000,m0,options)
%字函数,接受上面L传递的数据%
function L=mnp(l)
L=l;n=length(L);
对m赋任意值,以便下面的方程可以运行。(好像就是这里错了。m本不应该赋值的,但是不赋值的话运行结果就会显示说m没有定义。m本来就是上面主函数要求的未知数)%
m(1:n)=rand;
%循环写出方程%
for i=1:n, Mk(i)=L(i)*cos(m(i)); Ml(i)=L(i)*sin(m(i)); end
%对向量MK,Ml内部取和,后取其最后一项最为方程。目的是要写出MK=L(1)*cos(m(1))+L(2)*cos(m(2))+...  因为L是个变向量,我没有想到其他的方法可以写这个方程,所以用这个代替的。当然能有其他简洁的方法表示是最好的。)
e=cumsum(Mk); f=cumsum(Ml); x(n+1)=6;y(n+1)=0;
MK(1)=e(n)-x(n+1); MK(2)=f(n)-y(n+1);
f=[MK];%将方程赋值给f以便传递到下面%
%接受上面f的传递,以写出方程,给主函数求解%
function F=myfun000(f);
F=f;

[ 本帖最后由 ChaChing 于 2009-5-2 10:33 编辑 ]
发表于 2009-3-26 15:35 | 显示全部楼层
看了你的注释,我明白你根本不知道如何正确的写matlab程序,自己找本简单的书看看matlab中应该如何实现参数的传递

function F=myfun000(f);
F=f;
你觉得这个函数有存在的意义???一个简单的赋值操作,如何生成你需要的方程??

[ 本帖最后由 ydlcsu 于 2009-3-26 15:42 编辑 ]
 楼主| 发表于 2009-3-26 16:05 | 显示全部楼层
非常感谢楼上的指点,我也觉得这里是有问题的  但是不知道该如何表达求解。我这里找不到有关matlab函数讲解的书。所以还是希望大家能够多指教  谢谢啦!!
发表于 2009-3-26 16:23 | 显示全部楼层
网上搜一下,去精华区里看看,要不然你写程序写得痛苦,别人看你的程序更痛苦
发表于 2009-3-26 16:32 | 显示全部楼层
请勿再重复发一样帖, 尽可能一帖发完! 不想浪费时间帮忙编辑, 下次扣分:@)
建议楼主看下本版规则!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-17 12:52 , Processed in 0.070897 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表