不是诶 求解

查看: 3934|回复: 2|关注: 0
fzero和fsolve求出函数的0点时,求出的结果不是为初值就是...
<h1 style="color:# 麦片财富积分
新手, 积分 25, 距离下一级还需 25 积分
关注者: 1
[tdata Ch4 Ch6 Ch8]=textread('C:\Users\chenzhenwei\Desktop\B.txt','%n%n%n%n');
plot(tdata,Ch4,tdata,Ch6,tdata,Ch8);
%通道4的拟合
p=polyfit(tdata,Ch4,4);
y=polyval(p,tdata);
plot(tdata,y,'r',tdata,Ch4,'g');
title('通道4');
legend('拟合图形','实际数据点');%得到函数的0点
[t1,t2]=fsolve(@(x)f4(p,x)-0,[33.476 33.483]);
fzero(@(x)f4(p,x),33.47])
33.822 -0..018457
33.047 -0..010455
33.826 -0..001869
33.165 0..012265
33.656 0..015419
33.038 0..009111
33.094 0..004848
33.597 0..006074
33.605 0..009111
33.996 -0..01098
33.377 -0..001869
33.979 -0..01285
运行程序后,得到通道4的实际数据点和拟合曲线,如图通道4:
通道4.jpg (33.12 KB, 下载次数: 533)
10:53 上传
根据图形 我选取初始点 求取函数为0时X对应的点
[t1,t2]=fsolve(@(x)f4(p,x)-0,[33.476 33.483]);
matlab如下提示:
Equation solved, fsolve stalled.
fsolve stopped because the relative size of the current step is less than the
default value of the step size tolerance squared and the vector of function values
is near zero as measured by the default value of the function tolerance.
&stopping criteria details&
& &33.4760& &33.4830
& &-0.0044& &-0.0005
显然不对。
t2=fsolve(@(x)f4(p,x)-0,[33.476 33.483])
Equation solved, fsolve stalled.
fsolve stopped because the relative size of the current step is less than the
default value of the step size tolerance squared and the vector of function values
is near zero as measured by the default value of the function tolerance.
&stopping criteria details&
& &33.4760& &33.4830
也不对 结果还是为初值
fzero(@(x)f4(p,x),33.476)
Exiting fzero: aborting search for an interval containing a sign change
& & because NaN or Inf function value encountered during search.
(Function value at -3.4 is -Inf.)
Check function or try again with a different starting value.
也没有找到函数值为0的点
关注者: 9
你的计算的设置问题,你可以试试下面代码,是可以得到结果的。options = optimset('TolX',1e-10,'TolFun',1e-10);
[t1,ft1]=fzero(@(x)f4(p,x),33.48,options);复制代码FSOLVE的提示是说满足求解中止准则所以中止了,具体的需要做哪些调整,和你的数据和方程都是有关系的。另外,FSOLVE通常用于求解非线性方程组,对于单一方程的求解,用FZERO简单些。
帖子最佳答案
关注者: 435
|此回复为最佳答案
本帖最后由 winner245 于
23:51 编辑
这里出错的主要原因是你的函数自变量范围仅仅是在【33.475,33.485】的一个长度仅为0.01的狭小区间。这么一个狭小区间上,你的拟合4此函数的系数又都很大。由于你的定义区间过于狭小,为了保证足够的精度,fsolve函数在搜索0点过程中,需要指定很小的搜索步长,这个步长已经小于了matlab默认步长,在这些小的步长对应的横坐标上,其函数值几乎都接近0,所以出现了the vector of function values is near zero的提示。所以真正的0点就被淹没在了许多“伪0点里”,所以,fsolve函数就无法找到真正的0点了。
你这个帖子发了两处,我在你另一处的帖子()里对上述问题有详细解答。
下面给出解决办法,用符号函数 solve 来求解0点,不用关心函数的数值特性,更不用担心初始迭代值是否合理。
用solve函数求解符号方程:syms x
solve(p(1).*x.^4+p(2).*x.^3+p(3).*x.^2+p(4).*x.^1+p(5))复制代码得到4个符号解:
& && && && && && && && && && && && && &&&33.145248
& && && && && && && && && && && && && &&&33.290188
33.162299 + 0.*i
33.162299 - 0.*i
之所以有4个解,是因为方程是4次。因为你只对实数解感兴趣,你只需要提取前两个解,或者你在solve里加一个参数,只求取实数解:syms x
double(solve(p(1).*x.^4+p(2).*x.^3+p(3).*x.^2+p(4).*x.^1+p(5),'Real',1))复制代码得到:
& && && & 33.1
& && && & 33.7
站长推荐 /2
Powered by农业部长:土改不是为解决城市用地 不鼓励圈地 _ 东方财富网()
农业部长:土改不是为解决城市用地 不鼓励圈地
东方财富网APP
方便,快捷
手机查看财经快讯
专业,丰富
一手掌握市场脉搏
手机上阅读文章
  图为农业部部长韩长赋。  12月6日上午,农业部部长韩长赋,总经济师、新闻发言人毕美家介绍我国粮食增产农民增收以及贯彻落实十八届精神等情况,并答记者问。韩长赋称推进土地制度改革的基本出发点是为了增加农民的财产性收入,不是为了解决城市建设的用地指标,不是让城市居民到农村购买宅基地盖房子,也不是鼓励工商资本到农村去圈地,我们应该把握,中央主要是从维护农民的权益角度来考虑的,这是我们政策的出发点。  以下为直播实录:  [中国新闻社]我想问一个农业农村改革的问题,农村土地制度是《决定》的重点内容,请分析《决定》有关土地制度改革有哪些新突破?新政策?最近关于有各种解读,请问应该怎么看待?谢谢。  [韩长赋]你提得问题是当前的热点问题,也是大家都关注的问题。土地制度是农村最基本的制度,土地关系是农村最基础的生产关系。土地权益也是农民最大的一块利益,所以土地制度的问题确实牵一发动全身。在土地制度的改革确实关系重大。十八届《决定》对农村土地制度改革作出了比较全面的部署,其中有许多的创新和突破。土地制度也好,也好,我们先要弄清所谓农村土地制度改革主要涉及哪几个方面,我想给记者朋友们介绍点情况。  [韩长赋]一是农户的承包地。我们最基本的土地制度安排,是指农村的土地是农民集体成员的土地,是集体所有,而且多数是村民小组的集体成员共同所有。土地分国有土地所有权、集体土地所有权,集体土地所有权里面50%以上是村民小组的所有权。  [韩长赋]二是农村的集体土地承包给了谁?是承包给农户的,不是承包给农户的某一个成员,是家庭承包,我们是家庭承包责任制,为什么有时候说农民家里有一个孩子上学了,上了大学,在城里留下来工作,没有回家,他的田没有收回来,因为他父母亲,还有其他家庭成员还在村里当农民,在种地,所以他的田是不收回来的。要依法保障农民的承包地权益,这是农民的第一个土地权益。《决定》讲得很清楚,要稳定农村土地承包关系并保持长久不变。农户的承包经营权是要保持稳定,是长久不变的。同时在原来的占有、使用、流转、收益等权益的基础上,再赋予农民对承包经营权的抵押、担保的权能,值得注意的是,承包经营权抵押的客体是土地经营权,不是承包权。也就是说,在承包或者流转土地上从事农业生产,并处置的权利,所以不是承包权,更不是所有权,而是经营权。  [韩长赋]在农村承包土地上可以说有三个权,首先是集体的所有权,然后是农户的承包权,接着还有一个是生产的经营权,我们现在流转的,也可以在一定条件下抵押、担保,指的是经营权。  [韩长赋]关于允许农村集体经营性建设用地入市,大家比较关注。这个问题我觉得现在有些解读不全面,不能误解误读,一定要把握好,这里有三个限定词:一是它是集体的经营性建设用地,并不是集体的所有的建设用地,因为农村还有公益性建设用地和宅基地,更不是原来建设用地之外的其他耕地,这是一个限定词。二是符合规划。即使取得土地使用权,要建设什么也要符合规划。三是用途管制。概括地说,允许入市的只是农村集体经营性建设用地,必须在符合规划和用途管制的前提下,农村集体的经营性建设用地才可以出让、租赁、入股,并不是说所有的农村建设用地都可以自由入市,而且我理解,即便是集体的经营性建设用地入市,首先也还要确权、确地,不能无证转让。还要规范公开的市场操作,不能私下授受,所以需要开展试点,不是一下就推开的。  [韩长赋]保障农户的宅基地用益物权。改革完善农村的宅基地制度,通过试点慎重稳妥地推进农民住房财产权抵押、担保、转让,探索增加农民财产性收入的渠道,这是《决定》中讲的,我们要全面理解,绝不能误以为农民的宅基地就可以自由买卖了,城里人就可以到农村买个宅基地盖房子,甚至盖别墅了,中央的精神不是这个意思。  [韩长赋]总体上讲,三中全会的决定在农村土地制度改革方面明确了方向,进行了全面部署,但是我们一定要全面正确地理解,特别是有两点不能误读误解:第一,推进土地制度改革的基本出发点是为了增加农民的财产性收入,不是为了解决城市建设的用地指标,不是让城市居民到农村购买宅基地盖房子,也不是鼓励工商资本到农村去圈地,我们应该把握,中央主要是从维护农民的权益角度来考虑的,这是我们政策的出发点。
(责任编辑:DF010)
[热门]&&&[关注]&&&
举报原因:
人身攻击 
侵权(诽谤、抄袭、冒用等)
举报邮箱:
举报成功!
请下载东方财富产品,查看实时行情和更多数据
网友点击排行
郑重声明:东方财富网发布此信息目的在于传播更多信息,与本网站立场无关。东方财富网不保证该信息(包括但不限于文字、数据及图表)全部或者部分内容的准确性、真实性、完整性、有效性、及时性、原创性等。相关信息并未经过本网站证实,不对您构成任何投资建议,据此操作,风险自担。
扫一扫下载APP
东方财富产品
关注东方财富
天天基金网
扫一扫下载APP
关注天天基金C#/.NET(18)
编程环境要求:VS2008/FX2.0
众所周知,从VS2005/FX2.0起,在多线程环境下是不允许跨线程修改主线程上窗口控件的。
private&void&button1_Click(object&sender,&EventArgs&e)
&&&&Thread&t&=&new&Thread(new&ThreadStart(CrossThreadCall));
&&&&t.Start();
public&void&CrossThreadCall()
&&&&Text&=&&test&;
将直接导致异常:
未处理 System.InvalidOperationException
& Message=&线程间操作无效: 从不是创建控件“Form1”的线程访问它。&
& Source=&System.Windows.Forms&
& StackTrace:
&&&&&& 在 System.Windows.Forms.Control.get_Handle()
&&&&&& 在 System.Windows.Forms.Control.set_WindowText(String value)
&&&&&& 在 System.Windows.Forms.Form.set_WindowText(String value)
&&&&&& 在 System.Windows.Forms.Control.set_Text(String value)
&&&&&& 在 System.Windows.Forms.Form.set_Text(String value)
&&&&&& 在 delegate_test1.Form1.CrossThreadCall() 位置 f:\app\delegate_test1\delegate_test1\Form1.cs:行号 26
&&&&&& 在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
&&&&&& 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
&&&&&& 在 System.Threading.ThreadHelper.ThreadStart()
通用的解决方法是使用Control.Invoke方法来调用一个Delegate,从而安全地跨线程调用。
public&void&CrossThreadCall()
&&&&Invoke(new&void_d(CrossThreadCall_Local));
void&CrossThreadCall_Local()
&&&&Text&=&&test&;
public&delegate&void&void_d();
但是这样的缺点是要不得不为每个调用编写一个Invoke跳板,还要额外声明一个委托类型,实在不怎么优雅。
于是我们想到用匿名函数来写。我的第一反应是:
Invoke(delegate&{&Text&=&&test&;&});
可惜不行。编译压根就没通过,写着:
无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型
无语,delegate竟然不是委托类型?
等我把Google翻了一遍后,找到了答案。
The problem the user is seeing is that the Thread ctor accepts a specific delegate -- the ThreadStart delegate.& The C# compiler will check and make sure your anonymous method matches the signature
of the ThreadStart delegate and, if so, produces the proper code under-the-covers to create the ThreadStart delegate for you.
But Control.Invoke is typed as accepting a &Delegate&.& This means it can accept any delegate-derived type.& The example above shows an anonymous method that has a void return type and takes no parameters.&
It's possible to have a number of delegate-derived types that match that signature (such as MethodInvoker and ThreadStart -- just as an example).& Which specific delegate should the C# compiler use?& There's no way for it to infer the exact delegate type so
the compiler complains with an error.
也就是说,对于Thread.ctor()来说,由于接受的是一个ThreadStart委托,编译器便可以将匿名函数与ThreadStart委托类型匹配,最后能够正确编译。
而对于Control.Invoke()来说,任何的代理类型都是可接受的,也就是说ThreadStart和MethodInvoker都是可以接受的类型。这样编译器反而不知道应该用哪个代理去匹配匿名函数了,导致了编译错误的发生。
知道了原因,问题就很容易解决了。我们只需要加上MethodInvoker这个wrapper就能使用匿名函数了。
Invoke(new&MethodInvoker(delegate&{&Text&=&&test&;&}));
或者更简单地,用Lambda表达式来解决问题:
Invoke(new&MethodInvoker(()&=&&Text&=&&test&));
希望本文能够帮助有同样困惑的朋友。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2141次
排名:千里之外
转载:29篇
(6)(18)(2)(6)

我要回帖

更多关于 规划求解 的文章

 

随机推荐