A. 求一道用matlab编程解非线性方程组
对于非线性方程组F(X)=0,用fsolve函数求其数值解。fsolve函数的调用格式为: X=fsolve('fun',X0,option) 其中X为返回的解,fun是用于定义需求解的非线性方程组的函数文件名,X0是求根过程的初值,option为最优化工具箱的选项设定。最优化工具箱提供了20多个选项,用户可以使用optimset命令将它们显示出来。如果想改变其中某个选项,则可以调用optimset()函数来完成。例如,Display选项决定函数调用时中间结果的显示方式,其中‘off’为不显示,‘iter’表示每步都显示,‘final’只显示最终结果。optimset(‘Display’,‘off’)将设定Display选项为‘off’。 例如:求下列非线性方程组在(0.5,0.5) 附近的数值解。 (1) 建立函数文件myfun.m。 function q=myfun(p) x=p(1); y=p(2); q(1)=x-0.6*sin(x)-0.3*cos(y); q(2)=y-0.6*cos(x)+0.3*sin(y); (2) 在给定的初值x0=0.5,y0=0.5下,调用fsolve函数求方程的根。 x=fsolve('myfun',[0.5,0.5]',optimset('Display','off')) x = 0.6354 0.3734 将求得的解代回原方程,可以检验结果是否正确,命令如下: q=myfun(x) q = 1.0e-009 * 0.2375 0.2957 可见得到了较高精度的结果。
B. python的解方程能力好像不是很强啊,为什么复杂一点的指数方程就求不出来了
内置的算法不支持这么复杂的方程求解,需要编写特别的算法。
C. PSO如何求解非线性方程组求解
PSO搜索需要一个适应度函数,粒子的好坏是根据其适应度来的,一个非线性方程组,比如说,
f1(x,y)=0;
f2(x,y)=0;
你要搜索它的解,需要定义一个适应度函数,你可以定义
|f1|+|f2|或者定义(f1)^2+(f2)^2,这样再搜索时寻找适应度函数值最小的那个解,最优粒子的适应度会越来越趋进0,当适应度函数值为0时,必有f1(x,y)=0;f2(x,y)=0;因此,就得到了方程组的解。
当然,你也可以根据侧重点的不同来定义适应度函数,例如,若希望优先考虑方程1,则可把适应度函数定义为10*|f1|+|f2|或者10*(f1)^2+(f2)^2,这里的10是我随意定的,实际中可根据需求来定。
另外,适应度函数,也不是一定向上面那么定义,你要定义为(f1)^4+(f2)^2等等也是可以的,只是最终的侧重点不同了,比如说,f1=0.1,f2=0.15,没有f1=0.3,f2=0.1的适应度好,显然是不合乎实际的。
再者,你还可以定义适应度函数为1/|f1| + 1/|f2| ,但是这样定义后,适应度函数值越大,粒子的适应度越好,在搜索的过程中,最优粒子的适应度函数值越来越大,但理论上适应度函数值为无穷大才行,实际搜索永远都达不到。
该说的我都说明了,以前写过PSO算法,这些都是自己的心得,不知道能否帮上你~~
D. 求解非线性方程组的牛顿迭代法的具体思想及方法并附有matlab 源程序
function x=Newton(fname,dfname,x0,e,N)
%用途:Newton迭代法解非线性方程f(x)=0
%fname和dfname分别表示f(x)及其导函数的M函数句柄或内嵌函数表达式
%x0为迭代初值,e为精度(默认值1e-7)
%x为返回数值解,并显示计算过程,设置迭代次数上限N以防发散(默认500次)
%实例:解方程ln(x+sin(x))=0
%在matlab窗口中输入:Newton(@(x)log(x+sin(x)),@(x)(1+cos(x))/(x+sin(x)),0.1)
if nargin<5,N=500;end
if nargin<4,e=1e-7;end
x=x0;x0=x+2*e;k=0;
fprintf('x[%d]=%12.9f\n',k,x)
while abs(x0-x)>e&&k<N
k=k+1;
x0=x;x=x0-feval(fname,x0)/feval(dfname,x0);
fprintf('x[%d]=%12.9f\n',k,x)
end
if k==N
fprintf('已达到迭代次数上限');
end
上面的程序段只是一个思路,你可以自己再理解一下,其实matlab中有一个内部函数fsolve,就可以直接求解非线性方程组的,很简单好用的!
祝你解决问题!
E. python解非线性方程组(3个),为什么只有一组解应该有2组解啊,求解!!!
这是我按照你的方法得到的结果
>>>importmath
>>>deff(list):
...x,y,z=list//注意这里是list的解包不过如果你不传入list而是别的比如字符串就需要用到tolist了
...return[math.sqrt((x-15.34)**2+(y-51.59)**2+(z-57.55)**2)-4.59,
math.sqrt((x-18.92)**2+(y-49.03)**2+(z-53.91)**2)-6.33,
math.sqrt((x-16.46)**2+(y-55.25)**2+(z-58.49)**2)-5.32]
...
>>>f([9,8,7])
[62.459132731154696,56.776381610737275,64.96110841470843]
>>>f([1,1,1])
[72.62972675424331,67.34140150696197,75.22299597109608]
>>>是三个结果没错啊
我猜你的 fsolve的方法内容是这样的吧
def fsolve(method,list):
return method(list)
或者你在fsolve里面对 f(list)返回的结果又做了一些操作,发一下你的 fsolve方法吧 要不然找不到问题所在 目前来看 你的f方法是正确的
F. 这种非线性方程组如何解
将常数先带进去,然后再解方程组!
不过,你确定你没写错吗?你的方程中一共有E R F S xA yA xS yS xF九个变量,后面七个一直,三个方程,两个变量啊!
>> [E R F S xA yA xS yS xF]=solve('E+R=F+S','E*yA+R*xA=F*xF','E*yS+R*xS=S','xF=0.2','F=100','S=100','xA=0.02','yA=1.356*xA^1.201','yS=1.618-0.6399*exp(1.96*yA)','xS=0.067+1.43*xA^2.273')
Warning: 10 equations in 9 variables.
你看,我把所有式子写在上面,求解析解时,警告:“10 equations in 9 variables.”即10个方程9个变量,方程无解,你确定你没错吗?
修改好了后给我发个消息,我再帮你解决
G. python解非线性方程组(3个),为什么只有
# encoding: utf-8
from scipy.optimize import fsolve
from numpy import *
beita = 1
gama = 1
#以下为Mohr-Columb准则计算
# def f(x):
# OH = (0.33/(1-0.33)+beita)*(14.12-0.73*4.68)+0.73*4.68
# Oh = (0.33/(1-0.33)+gama)*(14.12-0.73*4.68)+0.73*4.68
# Or = 0.946*x+0.25272
# Osita = 3*OH-Oh-x*0.683552239-1.481
# Oz = 12.639+0.66*(OH-Oh)+0.316447761*x
# x = float(x)
# return Osita-3.4164-(Or-3.4164)*4.4835+10.29
# result1 = fsolve(f, 7)
# print '摩尔-库伦准则计算结果:', result1*10/6/9.8, 'g/cm^3'
# 以下为Druker-Prager准则计算
def g(y):
OH = (0.33/(1-0.33)+beita)*(14.12-0.73*4.68)+
H. 如何解矩阵非线性方程组
只有1个矩阵是不能转化成非线性方程组的,还要知道一个列向量,这个列向量作为非其次方程组等号右边的量
然后矩阵的每行的每个元素后面依次加上x1...xn(如果这行有n个元素的话,也就是方程组有n个变量),第2行也是这样,一直到第n行(假设有n个方程组)