chenyouzhi 发表于 2009-3-18 12:00:26

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

本帖最后由 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)');
    = bisect('fu(k)',0,pi/2,1e-5);
end
y=c;
err

二、二分法子函数(“我相信本函数是无误的”):
function =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)可求吗?

messenger 发表于 2009-3-18 12:15:47

问题出现的原因是,matlab数组引用是从1开始的,不能从0开始,所以引用x(0)错误

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

chenyouzhi 发表于 2009-3-18 12:23:30

2# messenger

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

chenyouzhi 发表于 2009-3-18 20:09:02

问题应该是使内联函数inline定义函数是出现了错误,哪位高手能帮忙解释一下!

messenger 发表于 2009-3-18 22:47:03

改用function吧,inline如果要达到随循环改变变量的目的,非常麻烦

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

你回去再好好改改吧,你的程序要改的东西很多
页: [1]
查看完整版本: 循环中自变量的定义以及inline的使用