Python和科学计算认证群组  - 讨论区

标题:求助:Python求解非线性方程

2012年04月26日 星期四 12:55

     我是一个python学习的新手,觉得好玩,就想尝试用它来做数值模拟,在解fsolve的非线性方程组时,每次求解都说迭代效果不好。后来我尝试用了简单的方程来求解,要是初值设置的离真值比较远,迭代不出想要的结果。还有我发现python中不允许幂指数是小数,可我的方程中要用到,这个两个问题应该怎么解决呢,求高人解答,先谢谢了。

   

2012年04月26日 星期四 13:26

可以多用几个不同的初值,调用fsolve,然后中其中找出一个最优的解。

>> python中不允许幂指数是小数

不知道这是什么意思?是指2.5**0.3之类的吗?这个可以运算啊。

2012年04月26日 星期四 16:18

    问题出在底数是未知数,我的方程在迭代的时候这个未知数可能会出现负数。

举个例子:比如 X+Y=2,X+Y**0.5=1,在迭代的时候如果所输入的值离真值比较远,得不到想要的结果。

2012年04月26日 星期四 16:40

当未知数为负数的时候程序报错吗,fsolve应该不报错吧?你把程序贴出来看看吧。

用多组初值求解,然后选择其中结果最好的那个就可以了。

2012年04月26日 星期四 17:03

刚开始试着自己编程,程序比较冗长,水平很差,体谅。

这个是我随便编的一个,我的方程类似这个,但比他要复杂一点。每次求解都说没有好的解,只给出最后10次迭代。

from scipy.optimize import fsolve
import numpy as np
def func(x):
    a[0],a[1]=x
    return[0.1 - (a[0]*0.5+a[1]*0.5),
           (2800*(a[0]*0.5)**0.2 + 0.3*np.log(a[0]))*0.05/np.exp(a[0]*0.5)-\
                 (2800*(a[1]*0.5)**0.2 + 0.3*np.log(a[1]))*0.047/np.exp(a[1]*0.5)]
a=[0,0]
H=[1,1]
E=fsolve(func,H)
print E

 

2012年04月26日 星期四 18:46

程序贴到下面的地址了:

http://hyry.dip.jp/tech/forum/thread.html/50

程序的有些写法还需要改进,如果你的要求速度的话,最好不要用numpy的函数进行单个数值运算,这样比较慢。如果变量有取值范围的话,可以事先判断,并返回一个很大的值。

2012年04月26日 星期四 19:17

fsolve底层算法是hybrd和hybrj,看看原始文档的说明对参数会有更深的理解。另外数值分析时,越快的算法可能对于初始值和函数的性质要求越高。

fsolve is a wrapper around MINPACK’s hybrd and hybrj algorithms.

http://www.math.utah.edu/software/minpack/minpack/hybrd1.html

2012年04月26日 星期四 20:01

程序运行得到的解看着还挺好的,但可能是默认的误差太小了吧,还是有警告。谢谢你的帮助。

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号