matlab 迭代我使用matlab中的fsolve函数解方程组,老是出现exitflag=0,我查了下是说迭代超过最大值,我想问下解决办法,谢谢!我已经改过了,但是显示超过矩阵的维数,Index exceeds matrix dimensions.运算

来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/26 09:00:17
matlab迭代我使用matlab中的fsolve函数解方程组,老是出现exitflag=0,我查了下是说迭代超过最大值,我想问下解决办法,谢谢!我已经改过了,但是显示超过矩阵的维数,Indexexc

matlab 迭代我使用matlab中的fsolve函数解方程组,老是出现exitflag=0,我查了下是说迭代超过最大值,我想问下解决办法,谢谢!我已经改过了,但是显示超过矩阵的维数,Index exceeds matrix dimensions.运算
matlab 迭代
我使用matlab中的fsolve函数解方程组,老是出现exitflag=0,我查了下是说迭代超过最大值,我想问下解决办法,谢谢!
我已经改过了,但是显示超过矩阵的维数,Index exceeds matrix dimensions.运算进行不下去,我想知道当计算不收敛的时候,有哪些解决方法?难道只有不断的尝试初值,碰运气??

matlab 迭代我使用matlab中的fsolve函数解方程组,老是出现exitflag=0,我查了下是说迭代超过最大值,我想问下解决办法,谢谢!我已经改过了,但是显示超过矩阵的维数,Index exceeds matrix dimensions.运算
在后面加上optimset('MaxIter',最大迭代次数),例如
x = fsolve(@myfun,[2 3 4],optimset('MaxIter',100000))

有些方程本身就不收敛,无解的,是没有办法的
有些需要改变方程的形式,构造新的迭代形式

1.exitflag
>0---算法收敛
=0---达到最大迭代次数而停止
<0---算法收敛
你这里出现=0,不见得是不收敛,但是至少肯定此迭代公式收敛速度过慢。初值的选择固然非常重要,但是要不断尝试显然不是办法。
2.我想说一说,如何构造迭代函数使之具有较快的收敛速度,只说方程,方程组同理。
把求解方程g(x)=0转化为求不动点问题,从不动点方程...

全部展开

1.exitflag
>0---算法收敛
=0---达到最大迭代次数而停止
<0---算法收敛
你这里出现=0,不见得是不收敛,但是至少肯定此迭代公式收敛速度过慢。初值的选择固然非常重要,但是要不断尝试显然不是办法。
2.我想说一说,如何构造迭代函数使之具有较快的收敛速度,只说方程,方程组同理。
把求解方程g(x)=0转化为求不动点问题,从不动点方程f(x)=x自然引出迭代公式xn+1=f(xn).显然,f的构造方法不同,导致的收敛性(收敛或发散)及收敛速度均有不同。
从你目前的f出发,构造一族新的函数
h(a,x)=af(x)+(1-a)x, .........(*)
其中,a取[0,1]间的常数。注意到h(0,x)=x,h(1,x)=f(x),即y=x,y=f(x)都包含在该函数族中。
取定某a,对于h(a,x)的不动点,有:
x=h(a,x)=af(x)+(1-a)x,
移项,ax=af(x),即x=f(x),故h的不动点也是f的不动点。这样,可选择一组a的值来观察函数族(*)的变化,最后选定某a值做迭代。
3.关于迭代y=f(x)的收敛性,可使用下面定理以加以验证:
y=f(x)在[a,b]上连续,且a<=y<=b, 如果存在L<1,使得|f'(x)|<=L,则x=f(x)在[a,b]上有唯一解。

收起

在后面加上optimset('MaxIter',最大迭代次数),例如
x = fsolve(@myfun,[2 3 4],optimset('MaxIter',100000))

在后面加上optimset('MaxIter',最大迭代次数),例如
x = fsolve(@myfun,[2 3 4],optimset('MaxIter',100000))
1.exitflag
>0---算法收敛
=0---达到最大迭代次数而停止
<0---算法收敛
你这里出现=0,不见得是不收敛,但是至少肯定此迭代公式收敛速度过慢。...

全部展开

在后面加上optimset('MaxIter',最大迭代次数),例如
x = fsolve(@myfun,[2 3 4],optimset('MaxIter',100000))
1.exitflag
>0---算法收敛
=0---达到最大迭代次数而停止
<0---算法收敛
你这里出现=0,不见得是不收敛,但是至少肯定此迭代公式收敛速度过慢。初值的选择固然非常重要,但是要不断尝试显然不是办法。
2.我想说一说,如何构造迭代函数使之具有较快的收敛速度,只说方程,方程组同理。
把求解方程g(x)=0转化为求不动点问题,从不动点方程f(x)=x自然引出迭代公式xn+1=f(xn).显然,f的构造方法不同,导致的收敛性(收敛或发散)及收敛速度均有不同。
从你目前的f出发,构造一族新的函数
h(a,x)=af(x)+(1-a)x, .........(*)
其中,a取[0,1]间的常数。注意到h(0,x)=x,h(1,x)=f(x),即y=x,y=f(x)都包含在该函数族中。
取定某a,对于h(a,x)的不动点,有:
x=h(a,x)=af(x)+(1-a)x,
移项,ax=af(x),即x=f(x),故h的不动点也是f的不动点。这样,可选择一组a的值来观察函数族(*)的变化,最后选定某a值做迭代。
3.关于迭代y=f(x)的收敛性,可使用下面定理以加以验证:
y=f(x)在[a,b]上连续,且a<=y<=b, 如果存在L<1,使得|f'(x)|<=L,则x=f(x)在[a,b]上有唯一解。
任选一种方法即可

收起

你解的是线性方程组的话用solve就可以了,不会出现其它问题,若是微分方程组或偏微方程组,那就有点麻烦了,最好套用工程背景进行求解,比如可用振动理论中的求解震动规律的方法,要活学活用!

楼主没有给出具体的问题,我们在这不好回答。我猜你是在解一个比较特殊的非线性的方程组。
但说句实话,对于病态的方程组,很少有人用fsolve去解。
建议你用用启发式算法,比如matlab自带的遗传算法(Genetic Algorithm),模拟退火(Simulated Annealing)。当然你也可以在file exchange里下载网友提供的m文件,ant colony ,tab...

全部展开

楼主没有给出具体的问题,我们在这不好回答。我猜你是在解一个比较特殊的非线性的方程组。
但说句实话,对于病态的方程组,很少有人用fsolve去解。
建议你用用启发式算法,比如matlab自带的遗传算法(Genetic Algorithm),模拟退火(Simulated Annealing)。当然你也可以在file exchange里下载网友提供的m文件,ant colony ,tabu search 等等
如果你对matlab不熟的话,建议你干脆换一个软件,mathematica,可以免去很多需要用户设定初始值,迭代条件的这些麻烦。

收起