找回密码
 注册
Simdroid-非首页
查看: 94|回复: 4

循环中自变量的定义以及inline的使用

[复制链接]
发表于 2009-3-18 12:00:26 | 显示全部楼层 |阅读模式 来自 山东烟台
本帖最后由 chenyouzhi 于 2009-3-18 20:06 编辑

本人希望使用二分法对一个非线性方程进行求解,该方程是经过有限差分过程后得到的n个方程之一,为了得到最终结果必须对这n个方程进行依次求解,故本人在同一个for 循环中使用内联函数inline确立每个方程的函数表达(这其中就涉及到一个自变量的问题),随后直接使用二分法函数进行求解,得出的结果作为已知量用于下一次循环使用。
程序如下:

一、主程序:
function y = fff(a)
%求助举例
b=3;
c=4;
x=zeros(5);
x(1)=1;
for k=2:5
    fu(k) = inline('a*x(k-1)+b*x(k)-c*cos(x(k))','x(k)');
    [c,err,yc] = bisect('fu(k)',0,pi/2,1e-5);
end
y=c;
err

二、二分法子函数(“我相信本函数是无误的”):
function [c,err,yc]=bisect(f,a,b,delta)
% 二分法求解非线性方程
%Input - f is the function input as a string 'f'
%     - a and b are the left and right endpoints
%     - delta is the tolerance
%Output - c is the zero
%      - yc= f(c)
%       - err is the error estimate for c
if nargin<4 delta = 1e-4;end
ya=feval(f,a);
yb=feval(f,b);
if ya*yb > 0,return,end
max1=1+round((log(b-a)-log(delta))/log(2));
for k=1:max1
c=(a+b)/2;
yc=feval(f,c);
if yc==0
  a=c;
  b=c;
elseif yb*yc>0
  b=c;
  yb=yc;
else
  a=c;
  ya=yc;
end
if b-a < delta, break,end
end
c=(a+b)/2;
err=abs(b-a);
yc=feval(f,c);

在MATLAB窗口执行fff后,问题出现了......
??? Attempted to access x(1); index must be a positive integer or logical.


希望得到三个方面的解答:
1、上述算法问题在哪里,该如何改进?
2、内联函数inline的使用限制?
3、feval是不是可以直接在这里使用,即feval(f,c)可求吗?
发表于 2009-3-18 12:15:47 | 显示全部楼层 来自 浙江杭州
Simdroid开发平台
问题出现的原因是,matlab数组引用是从1开始的,不能从0开始,所以引用x(0)错误

顺便说一句,你这个x(0)好象在后边的循环中没有用到呀,似乎你想实现的是x(1)=1;
回复 不支持

使用道具 举报

 楼主| 发表于 2009-3-18 12:23:30 | 显示全部楼层 来自 山东烟台
2# messenger

对,这个主程序是我在网上编的,有个瑕疵,改成x(1)问题是不是就没了?要不请你帮我调试一下看看,多谢。
(我自己的电脑没联网,我在网吧:'( )
回复 不支持

使用道具 举报

 楼主| 发表于 2009-3-18 20:09:02 | 显示全部楼层 来自 山东烟台
问题应该是使内联函数inline定义函数是出现了错误,哪位高手能帮忙解释一下!
回复 不支持

使用道具 举报

发表于 2009-3-18 22:47:03 | 显示全部楼层 来自 浙江杭州
改用function吧,inline如果要达到随循环改变变量的目的,非常麻烦

另外,你的bisect函数,要求 f 函数在a,b两端点处的函数值的符号相反

你回去再好好改改吧,你的程序要改的东西很多
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-7 11:31 , Processed in 0.061798 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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