#include<stdioh>
#include<mathh>
void main()
{
void function1();//搜索法
void function2();//二分法
void function4();//牛顿法
int choice;
printf("请选择求解的方法:\n\t1搜索法\n\t2二分法\n\t3牛顿法\n:");
switch(1)
{
case 1: function1();
case 2: function2();
case 4: function4();
}
}
void function1()//搜索法计算非线性方程的解
{
double expression1(double);
double lpoint=10,rpoint=20,step=00001;
while(expression1(lpoint)<-000001)
{
lpoint=lpoint+step;
}
printf("运用搜索法所求结果:%f\n",lpoint);
}
void function2()//二分法计算非线性方程的解
{
double expression1(double);
double lpoint=1,rpoint=2,mpoint;
mpoint=(lpoint+rpoint)/2;
while(fabs(expression1(mpoint))>000001)
{
mpoint=(lpoint+rpoint)/2;
if(expression1(lpoint)expression1(mpoint)<0)
rpoint=mpoint;
else
lpoint=mpoint;
}
printf("运用二分法所求结果:%f\n",mpoint);
}
void function4()//牛顿法计算非线性方程的解
{
double expression1(double);
double expression2(double);
double x=15;
while(expression1(x)>000001)
{
x=x-expression1(x)/expression2(x);
}
printf("运用牛顿法所求结果:%f\n",x);
}
double expression1(double x)
{
double result;
result=xxx-xx-1;
return result;
}
double expression2(double x)
{
double result;
result=3xx-2x;
return result;
function [min fmin]=goldenmean(myfun)
%myfun为字符串,自变量为x
clear;clc
%-----------进退法确定搜索区间
if nargin==1
x0=0;
epsilon=0001;
end
a0=0;h=001;e=035;
a1=a0;a2=a1+h;
fun=inline(myfun,'x'); %修改
解:f(0)=4,f(4)=4
4×0618=2472,
f(2472)=0222784
4-2472=1528,
f(1528)=0222784
可见,极小点在[1528,2472]内。
(2474-1528)×0618)=0584628
2474-0584628=1889372
f(1889372)=0012238554384
1528+0584628=2112628
f(2112628)=0012685066384
可见,极小点在[1889372,2112628]内。
……
以此类推,就行了。
改种问题,目前很少有手工计算的,一般都是编一个程序上机计算
function [p,u]=nlp618(f_name,a,b,e)
%//////////////////////////////////////////////////
%输入f_name为函数名,[a,b]初始区间,e为最小区间要求
%输出p为所有的计算情况,u为最优解,表示x,step为计算步骤
%//////////////////////////////////////////////////
a(1)=a;
b(1)=b;
L=e;
t(1)=a(1)+0382(b(1)-a(1));
u(1)=a(1)+0618(b(1)-a(1));
k=1;
m(1)=feval(f_name,t(1));
n(1)=feval(f_name,u(1));
while(b(k)-a(k)>L)
if(m(k)>n(k))
a(k+1)=t(k);
b(k+1)=b(k);
t(k+1)=u(k);
u(k+1)=a(k+1)+0618(b(k+1)-a(k+1));
else
a(k+1)=a(k);
b(k+1)=u(k);
u(k+1)=t(k);
t(k+1)=a(k+1)+0382(b(k+1)-a(k+1));
end
m(k+1)=feval(f_name,t(k+1));
n(k+1)=feval(f_name,u(k+1));
ans=feval(f_name,t(k+1));
k=k+1;
end
t(k)=0;
u(k)=0;
m(k)=0;
n(k)=0;
p=[a',b',t',u',m',n'];
ans=(a(k)+b(k))/2;
step=k-1
%函数
function y=f1(x)
y=x^2-4x+4;
//////////////////////////////////////////////////////////////////////
运行结果
>> [p,u]=nlp618('f1',-10,10,0001)
step =
21
p =
-10 10 -236 236 1901 01296
-236 10 236 52785 01296 10748
-236 52785 05579 236 20797 01296
05579 52785 236 34752 01296 21763
05579 34752 16723 236 010738 01296
05579 236 12463 16723 056806 010738
12463 236 16723 19346 010738 00042814
16723 236 19346 20973 00042814 00094681
16723 20973 18347 19346 0027337 00042814
18347 20973 19346 1997 00042814 91529e-006
19346 20973 1997 20351 91529e-006 00012347
19346 20351 1973 1997 000072978 91529e-006
1973 20351 1997 20114 91529e-006 000012988
1973 20114 19877 1997 000015231 91529e-006
19877 20114 1997 20023 91529e-006 54217e-006
1997 20114 20023 20059 54217e-006 34659e-005
1997 20059 20004 20023 14382e-007 54217e-006
1997 20023 1999 20004 96081e-007 14382e-007
1999 20023 20004 20011 14382e-007 11333e-006
1999 20011 19998 20004 39646e-008 14382e-007
1999 20004 19995 19998 21243e-007 39646e-008
19995 20004 0 0 0 0
u =
2
最优解在x=2
f(x)=0
以上就是关于急求C语言用1进退法2二分法3黄金分割法4牛顿切线法5综合法这五种方法的NS图和程序,简单就好,急!全部的内容,包括:急求C语言用1进退法2二分法3黄金分割法4牛顿切线法5综合法这五种方法的NS图和程序,简单就好,急!、matlab 函数句柄问题、试用0.618法(黄金分割法)求f(x)=x^2-4x+4在区间[0,4]的极小点,要求缩短后的区间长度不大于原区间的8%等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)