【问题标题】:Finding real roots of polynomial by using fzero使用 fzero 求多项式的实根
【发布时间】:2015-03-21 06:57:27
【问题描述】:

我只想找到方程的真正根;

4*sqrt((1-(z^2/f1^2))*(1-z^2))-(2-z^2)^2-(m*z^4*sqrt(1-z^2/f1^2)/ ...
  sqrt(1-((z^2/f1^2)/y^2)))

我知道方程包含复根,但我不想看到它们。此外,我的代码失败并说;

使用 fzero 时出错(第 242 行)区间端点处的函数值 必须是有限且实数。

scholte 中的错误(第 21 行)x=fzero(fun,x0)

这是我的代码;

rho2 = 1000; %kg/m3    
rho1 = 2700; %kg/m3    
cl2 = 1481; %m/s    
cl1 = 5919; %m/s    
m = rho2/rho1;    
y = cl2/cl1;    
poi = 0.25;

f1 = (sqrt((1-2*poi)/(2*(1-poi))))^-1;

fun = @(z) 4*sqrt((1-(z^2/f1^2))*(1-z^2))-(2-z^2)^2- ...
      (m*z^4*sqrt(1-z^2/f1^2)/sqrt(1-((z^2/f1^2)/y^2)));

x0 = [1 10];

x = fzero(fun, x0)

我多次更改 x0 间隔,但显示相同的错误。如何修复我的代码?

【问题讨论】:

  • 乍一看,abs / real 等可能会有所帮助。
  • 您可以尝试以下操作:在区间 [0, 2.5] 中绘制函数的绝对值。您将看到{0, ~0.9, ~1.7} 可能存在三个根。然后你可以使用fminsearch 代替abs(fun(x))newtzero 来自文件交换为f(x) 三个起始值{0, 0.9, 1.7},看看迭代给出了什么。

标签: matlab root polynomial-math


【解决方案1】:

正如 Matlab 告诉你的那样,你的问题是 Function values at interval endpoints must be finite and real,在你的情况下它们不是真实的:

fun(x0(1))

ans =

  -1.0000 + 0.1454i

您的函数可能过于复杂,fzero 无法处理。但是我不是专家,让我们看看是否有比我知识更多的人可以为您指出解决该方程式的正确方向。

【讨论】:

  • 谢谢安德。我在等待正确的方向
  • "...只是太复杂了。"或者这只是一个虚构的原因?
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2013-03-01
  • 1970-01-01
  • 2018-01-10
相关资源
最近更新 更多