MATLAB中给DruPra = @(x, y) sqrt(x.^2 - x.*y + y.^2).*(1+(-0.2).*(x+y)./2./(sqrt(3.*(x.^2+y.^2-x.*y)./3)))-5; 这个求解设置容差
时间: 2024-02-19 20:58:03 浏览: 150
对于这个函数,我们可以使用 `contour` 函数来绘制等高线图,并通过设置 `LevelStep` 参数来控制轮廓线的细节。具体的实现步骤如下:
首先,我们需要定义一个网格,用于计算函数在某个区域内的取值。可以使用 `meshgrid` 函数来生成这个网格。例如,下面的代码将生成一个横轴范围在 [-10, 10],纵轴范围在 [-10, 10],步长为 0.1 的网格:
```
[x, y] = meshgrid(-10:0.1:10, -10:0.1:10);
```
接下来,我们使用 `DruPra` 函数来计算函数在每个点的取值。例如,下面的代码将计算出网格中每个点的函数取值:
```
z = DruPra(x, y);
```
最后,我们可以使用 `contour` 函数来绘制等高线图。例如,下面的代码将绘制函数的等高线图,并将 `LevelStep` 参数设置为 0.1:
```
contour(x, y, z, 'LevelStep', 0.1);
```
需要注意的是,由于函数在一些点上可能无定义,因此在计算函数值时需要特别注意。同时,由于函数可能具有多个极小值,因此需要选择合适的初始点来进行优化,以避免陷入局部最小值。
相关问题
%% Drucker-Prager 参数 a=-0.1039; %% Modified Drucker-Prager 参数 a1=0.9954; a2=0.0046; a3=-5.65469; %% 二维Mises vmc = @(x, y) sqrt(x.^2 - x.y + y.^2)-1; %% 二维 Tresca trc = @(x, y) 0.5 * max(cat(3, abs(x - y), abs(x), abs(y))-1, [], 3); %% Drucker-Prager和Modified Drucker-Prager DruPra = @(x, y) sqrt(x.^2 - x.y + y.^2)(1+a(x+y)/2/ sqrt(x.^2 - x.*y + y.^2))-1; xx = linspace(-6, 6, 1000); yy = linspace(-6, 6, 1000); [X, Y] = ndgrid(xx, yy);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% contour(X, Y, vmc(X, Y), [1 1]) hold on contour(X, Y, trc(X, Y), [1 1]); hold on contour(X, Y, DruPra(X, Y), [1 1]); hold on % contour(X, Y, ModiDruPra(X, Y), [1 1]); title('Mises Yield Surface in 2D Principal Stress Space'); hold on,,给这段程序改成有求解容差的程序
可以将程序改写为以下形式,增加了一个函数 `DruPra_f` 用于计算 Drucker-Prager 函数值,同时在调用 `fminsearch` 函数时添加了选项 `options`,其中设定了求解容差。
```
% Drucker-Prager 参数
a = -0.1039;
% Modified Drucker-Prager 参数
a1 = 0.9954;
a2 = 0.0046;
a3 = -5.65469;
% 二维Mises
vmc = @(x, y) sqrt(x.^2 - x.*y + y.^2) - 1;
% 二维 Tresca
trc = @(x, y) 0.5 * max(cat(3, abs(x - y), abs(x), abs(y)) - 1, [], 3);
% Drucker-Prager函数
DruPra_f = @(x, y) sqrt(x.^2 - x.*y + y.^2) .* (1 + a * (x + y) / 2 / sqrt(x.^2 - x.*y + y.^2)) - 1;
% 设定求解容差
options = optimset('TolFun', 1e-6, 'TolX', 1e-6);
% 生成坐标网格
xx = linspace(-6, 6, 1000);
yy = linspace(-6, 6, 1000);
[X, Y] = ndgrid(xx, yy);
% 绘制等值线图
contour(X, Y, vmc(X, Y), [1 1])
hold on
contour(X, Y, trc(X, Y), [1 1])
hold on
contour(X, Y, DruPra(X, Y), [1 1])
hold on
% contour(X, Y, ModiDruPra(X, Y), [1 1]);
title('Mises Yield Surface in 2D Principal Stress Space')
hold on
% 求解 Drucker-Prager 函数值
x0 = [0, 0];
fminsearch(@(x) DruPra_f(x(1), x(2)), x0, options);
```
注意,在 `DruPra_f` 函数的定义中,需要将 `x.y` 改为 `x.*y`,否则会出现错误。
阅读全文